解题思路:贪心的思路求解,先对订单的时间从小到大排序,要减去到当前订单的外卖店的时间与上一次到达该店的时间,这段时间是没有订单的,然后加上订单的数量。最后判断哪些订单从某一时间起就没有订单即可
#include<bits/stdc++.h>
#define x first
#define y second
#define mem1(h) memset(h,-1,sizeof h)
#define mem0(h) memset(h,0,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
namespace IO{
inline LL read(){
LL o=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}
return o*f;
}
}using namespace IO;
const int N=1e5+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e9+7,P=131;
PII order[N];
int score[N],last[N];
bool st[N];
int n,m,T;
int main(){
cin>>n>>m>>T;
for(int i=0;i<m;i++)cin>>order[i].x>>order[i].y;
sort(order,order+m);
for(int i=0;i<m;){
int j=i;
while(j<m&&order[i]==order[j])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;
}
}
int res=0;
for(int i=1;i<=n;i++)res+=st[i];
cout<<res<<endl;
return 0;
}