第九届蓝桥杯省赛C++B组 日志统计

题目:
小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有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容器存放时间范围,用尺取法去解题!


解题思路:

#include<bits/stdc++.h>
using namespace std;
vector<int> a[1000005];   //vector用来存储对应的时间范围 
set<int> s;   //设置一个不重复的id编号 
int k;
bool IsRT(int x)
{
    int len=a[x].size();   //记录帖子被赞了几次 
    int l=0,r=0,count=0; 
    if(len<k) return 0;   //若被赞次数已经小于其热帖符合的次数则就返回0 
    sort(a[x].begin(),a[x].end();   //对未返回的帖子所记录的时刻排序 
    //用尺取法,r在前,l在后,当点赞数大于等于k,
    //判断时间间隔,不满足就l往前取,r继续往后取,直到点赞数大于等于k执行
    //相同判断,不断重复直至结束。

    while(l<=r&&r<len)
    {
        count++;
        if(count>=k){
            if(a[x][r]-a[x][l]<k)   //在次数满足条件的情况下,判断时间间隔是否满足条件 
            {
                return 1;
            }
            else{
                l++;
                count--;
            }
        }
        r++;
    }
    return 0;
}
int main()
{
    int n,d,id,ts;
    cin>>n>>d>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>ts>>id;   //输入ts时刻和编号为id的帖子 
        a[id].push_back(ts);   //vcctor容器对应的id中加入新的ts 
        s.insert(id);   //存入按顺序不重复的所有id编号
    }
    int m=s.size();   //m代表有多少个不同的帖子 
    for(int i=0;i<m;i++)//依次进行判断其是否是热帖 
    {

        set<int>::iterator it=s.begin();
        int y=*it;
        s.erase(y);   //将判断过的元素删除,使下一个元素为s.begin(); 
        if(IsRT(y)) cout<<y<<endl;   //若是的话则输出 
    }
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值