算法1
这个题好难啊,过一段时间需要再看看,不过思路很清奇
C++ 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define x first
#define y second
const int N=100010;
int n,m,T;
int score[N],last[N];//score表示第i个店铺当前的优先级
bool st[N];//last表示第i个店铺上一次有订单,st表示第i个店铺是否处于优先级中
typedef pair<int,int> PII;
PII order[N];
int main(){
scanf("%d%d%d",&n,&m,&T);
for(int i=0;i<m;i++)scanf("%d%d",&order[i].x,&order[i].y);
sort(order,order+m);
for(int i=0;i<m;){
int j=i;
while(j<m && order[j]==order[i])j++;
int t=order[i].x,id=order[i].y,cnt=j-i;
i=j;
score[id]-=t-last[id]-1;
if(score[id]<0)score[id]=0;
if(score[id]<=3)st[id]=false;
score[id]+=cnt*2;
if(score[id]>5)st[id]=true;
last[id]=t;
}
for(int i=1;i<=n;i++)
if(last[i]<T){
score[i]-=T-last[i];
if(score[i]<=3)st[i]=false;//处理t时刻之前的内容
}
int res=0;
for(int i=1;i<=n;i++)res+=st[i];
printf("%d\n",res);
return 0;
}