日志統計|2018年藍橋杯B組題解析第八題-fishers


標題:日志統計

小明維護着一個程序員論壇。現在他收集了一份"點贊"日志,日志共有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

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標准;
不要調用依賴於編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

思路:原來的代碼有誤,應該采用尺取法,現已改正。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,d,k,ts,id;
vector<int> ve[1010];
int ans[1010];

int judge(int x){
    int len=ve[x].size();
    if(len<k){
        return 0;
    }
    sort(ve[x].begin(),ve[x].end());
    int l=0,r=0,sum=0;
    while(l<=r &&r<len){
        sum++;
        if(sum>=k){
// 			滿足條件 
            //時間間隔小於d
            if(ve[x][r]-ve[x][l]<d){
                return 1;
            }
            else{
//            	尺取法 ts左端點后移 點贊總數-1 
                l++;sum--;
            }
        }
        r++;
    }
    return 0;
}


int main(){
    std::ios::sync_with_stdio(false);
    cin>>n>>d>>k;
    for(int i=1;i<=n;i++){
        cin>>ts>>id;
        ve[id].push_back(ts); //vector容器對應的id中加入新的ts 
    }
    int cnt=0;//記錄最終熱文的數量 
    for(int i=1;i<=n;i++){
        if(judge(i)){ //判斷是否是熱文 
            ans[++cnt]=i;
        }
    }
    for(int i=1;i<=cnt;i++){
        cout<<ans[i]<<endl;
    }
    
    return 0;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM