1. 程式人生 > >2018年第九屆藍橋杯 第b八題:日誌統計(滿分21分)

2018年第九屆藍橋杯 第b八題:日誌統計(滿分21分)

event pen lap nbsp back 進行 幫助 輸出 約定

標題:日誌統計 小明維護著一個程序員論壇。現在他收集了一份"點贊"日誌,日誌共有N行。其中每一行的格式是: ts id 表示在ts時刻編號id的帖子收到一個"贊"。 現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少於K個贊,小明就認為這個帖子曾是"熱帖"。 具體來說,如果存在某個時刻T滿足該帖在[T, T+D)這段時間內(註意是左閉右開區間)收到不少於K個贊,該帖就曾是"熱帖"。 給定日誌,請你幫助小明統計出所有曾是"熱帖"的帖子編號。 【輸入格式】
第一行包含三個整數N、D和K。
以下N行每行一條日誌,包含兩個整數ts和id。 對於50%的數據,1 <= K <= N <= 1000
對於100%的數據,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000 【輸出格式】
按從小到大的順序輸出熱帖id。每個id一行。 【輸入樣例】
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3 【輸出樣例】
1
3
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms 解題思路: 構造一個二維數組,數組的行對應每個帖子的 id,可以用行下標和帖子id進行關聯。每行的內容記錄點贊的實際ts。 對數組的每行排序,按照ts值從小到大排序。 對每一行,滑動起始位置,找到到達K個贊的結束位置,取出兩個端點的時間,計算時間差看是否滿足小於D。 技術分享圖片
 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 const long int NUM = 100000;  
 6 vector< vector<int> >  v_ids(NUM+1);
 7 int N,D,K;
 8 
 9 bool check(vector<int> v){
10     int j=0;
11     int r=j+K-1;
12     bool
flag = false; 13 while(r<v.size()){ 14 if(v[r]-v[j] < D){ 15 flag = true; 16 break; 17 } 18 else{ 19 j++; 20 r=j+K-1; 21 } 22 } 23 return flag; 24 } 25 26 int main(){ 27 cin>>N>>D>>K; 28 int ts,id; 29 int i; 30 for(i=0;i<N;i++){ 31 cin>>ts>>id; 32 v_ids[id].push_back(ts); 33 } 34 for(i=0;i<=NUM;i++){ 35 if( !v_ids[i].empty() ){ 36 sort(v_ids[i].begin(),v_ids[i].end()); 37 if (check(v_ids[i])) 38 cout<<i<<endl; 39 } 40 } 41 }
using vector

2018年第九屆藍橋杯 第b八題:日誌統計(滿分21分)