题目描述
帖子有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;
}