双指针应用
作者:
巷港
,
2022-03-09 00:40:25
,
所有人可见
,
阅读 273
外卖优先级
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int pri[N]; //表示每个外卖店的优先级
int last[N]; //表示每个外卖店上次有订单的时刻
bool st[N]; //标记一下每个外卖点是否在优先缓存中,1表示在,0表示不在
typedef pair<int,int>PII;
#define x first
#define y second
PII order[N]; //表示订单,每个订单包含订单的时间和外卖店的id
int n,m,T;
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); //pair默认按照第一关键字排序,使得订单是按照时间形成非递减的序列
for (int i=0;i<m;)
{
//双指针算法
int j=i;
//先统计一下具有相同订单的数量,因为是排序后的,所以如果有同一时间有多笔订单的情况,一定是连续挨着的!
while (order[i]==order[j]&&j<m) j++;
int t=order[i].x,id=order[i].y;
int cnt = j-i; //表示相同订单的个数==j-i+1-1,注意这里i从0开始的,边界问题要注意一下!
i=j; //指针跟上
pri[id]-=t-last[id]-1; //此时优先级需要减去没有订单的这段时间,即t-last[id]-1,注意t时刻和last[id]都有订单!
if (pri[id]<0) pri[id]=0;
if (pri[id]<=3) st[id]=false;
//算完了优先级需要减去多少,再算是要加上多少
pri[id]+=cnt*2;
if (pri[id]>5) st[id]=true;
last[id]=t; //将id号的外卖店上次有订单的时间更新一下
}
//这里注意,最后一次有订单的时刻不一定是题目给定的T时刻,需要特判一下!
for (int id=1;id<=n;id++)
{
if (last[id]<T)
{
pri[id]-=T-last[id];
if (pri[id]<=3) st[id]=false;
}
}
int ans=0;
for (int i=1;i<=n;i++)
{
if (st[i]) ans++;
}
printf("%d\n",ans);
return 0;
}