[蓝桥杯][2019年第十届真题]外卖店优先级
从样例可看出同一外卖店某一时刻可能会有多个订单。
我们先将订单按时间排序,再按外卖店编号排序,这样同一时刻若存在多个订单,外卖店编号相等的一定相邻。
对某一时刻\(T_i\)的订单来说,我们累加该时刻同一外卖店编号的所有订单产生的优先级。
在累加优先级前,先计算出外卖店距离上次产生订单的时刻至\(T\)时刻时间内,由于没有订单所带来的优先级的减少。
之后累加\(T_i\)时刻所有订单带来的的优先级的增加。
最后再对最终的\(T\)时刻特殊处理一下即可。
注意点
并不需要真的将优先级大于\(5\)的外面店加入缓存队列中,只需一个标记数组表明是否在队列中即可。
const int N=1e5+10;
PII a[N];
int level[N];
int last_time[N];
bool vis[N];
int n,m,t;
int main()
{
cin>>n>>m>>t;
for(int i=0;i<m;i++)
cin>>a[i].fi>>a[i].se;
sort(a,a+m);
for(int i=0;i<m;)
{
int j=i;
while(j<m && a[j] == a[i]) j++;
int tim=a[i].fi,id=a[i].se;
level[id]-=tim-last_time[id]-1;
level[id]=max(level[id],0);
if(level[id] <= 3) vis[id]=false;
level[id]+=(j-i)*2;
if(level[id] > 5) vis[id]=true;
last_time[id]=tim;
i=j;
}
for(int i=1;i<=n;i++)
if(last_time[i] < t)
{
level[i]-=t-last_time[i];
if(level[i] <= 3) vis[i]=false;
}
int res=0;
for(int i=1;i<=n;i++)
if(vis[i])
res++;
cout<<res<<endl;
//system("pause");
return 0;
}