zoukankan      html  css  js  c++  java
  • 第九届蓝桥杯省赛真题 日志统计

    标题:日志统计
    
    小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有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  

    题解:通过vector数组储存各id对应的收到赞的时间点,然后排序,再用尺取法验证,通过的id则输出;

    #include<iostream>
    #include<math.h>
    #include<algorithm>
    #include<vector>
    #include<set>
    #define ll long long
    using namespace std;
    vector<int>v[100011];
    vector<int>p;
    int d,k;
    bool check(int x){
            if(v[x].size()<k)
                    return 0;
            int i=0,j=0,len=0;//左端点,右端点,尺子长度
            while(i<=j&&j<v[x].size()){
                    len++;
                    if(len==k){
                            if(v[x][j]-v[x][i]<d)
                                    return 1;
                            else
                                    i++,len--;//向右移
                    }
                    j++;
            }
            return 0;
    }
    int main()
    {
            int n;
            scanf("%d%d%d",&n,&d,&k);
            while(n--){
                    int t,id;
                    scanf("%d%d",&t,&id);
                    p.push_back(id);
                    v[id].push_back(t);
            }
            sort(p.begin(),p.end());//排序
            p.erase(unique(p.begin(),p.end()),p.end());//去重
            for(int k=0;k<p.size();k++){
                    if(check(p[k]))
                            printf("%d
    ",p[k]);
            }
            return 0;
    }
    // bool check(int x)
    // {
    //         if(v[x].size()<k)
    //                 return 0;
    //         sort(v[x].begin(),v[x].end());
    //         int  i=0,j=v[x].size()-1;
    //         while(i<j){
    //                 if(j-i+1<k)
    //                         return 0;
    //                 if(v[x][j]-v[x][i]<d&&j-i+1>=k)//时间差小于d且赞个数大于等于k
    //                         return 1;
    //                 else
    //                         if(v[x][i+1]-v[x][i]>v[x][j]-v[x][j-1])/最前和最后两段删去时间差长的
    //                                 i++;
    //                         else
    //                                 j--;
    //         }
    //         return 0;
    // }
  • 相关阅读:
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Python eval() 函数
    Python repr() 函数
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10704484.html
Copyright © 2011-2022 走看看