蓝桥杯 日志统计题解 贪心简洁容易理解

1 篇文章 0 订阅
1 篇文章 0 订阅

题目描述
帖子有n行,d时间内k个赞为热帖,输出热帖编号
帖子有n行,d时间内k个赞为热帖,输出热帖编号

贪心
用pair< int,int > a[N]来存数据,每行输入的是 ts id,我们将ts存入a[i].second,id存入a[i].first
然后用sort排序a,sort对pair排序默认先对first升序,当first相同时对second升序排序。排序之后相同id的帖子就会相邻,且按时间从小到大排列。
然后我们直接遍历数组,对每一位进行判断,首先看当前位和当前位+k-1后的位id是否相同,再看两者时间差距(比较second)是否小于d,是的话就用个布尔数组存起来。最后就直接遍历布尔数组,是true的就输出就完事了。

C++ 代码

include< iostream >
include< algorithm >
using namespace std;
typedef long long ll;
typedef pair< int,int > PII;
const int N=3e5+5;//数组开大点省事,因为循环中会出现a[i+k],所以要开2e5以上比较省事
PII a[N];//first存id,second存ts
bool b[N];//true为热帖
int k,n,d;
int main()
{
cin>>n>>d>>k;
for(int i=1;i<=n;i)
cin>>a[i].second>>a[i].first;
sort(a+1,a+1+n);//默认对first升序,当first相同时对second升序排序。
for(int i=1;i<=n;i){
if(a[i+k-1].first==a[i].first&&a[i+k-1].second-a[i].second<d//看k-1位后id是否相同,不相同说明帖子
&&!b[a[i].first]){//都没k个,肯定不是热帖,然后在判断时间
b[a[i].first]=true;//是热帖就记下来
}
}
for(int i=1;i<=1e5;i++)
if(b[i])
cout<<i<<endl;//输出
// system(“pause”);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值