1241. 外卖店优先级
特别思考一下,他是怎么处理同一时间相同的店铺的订单的。
j是往后枚举找,跳出while循环时一定不是相同的订单了,故订单是从 i ~ j-1
之间有 j - 1 - i + 1 = j-i个订单。
一开始 j = i,所以到了最后也会 j ++ .然后不符合 j<=m 了跳出循环 i =j,也跳出循环。
while(j<=m && order[i]==order[j]) j++; //第j的订单是不相同的,但是第i个订单没有算上,相当于补到第j个订单处
int t = order[i].x,id = order[i].y;
int cnt = j - i; //订单数为i ~ j - 1 故为 j - 1 - i + 1 = j-i;
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define x first
#define y second
using namespace std;
const int N = 1e5+10;
typedef pair<int,int> PII;
int f[N];
int last[N];
int st[N];
int n,m,T;
PII order[N]; //订单 .first 表示时间 .second 表示店铺编号
int main()
{
cin>>n>>m>>T;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&order[i].x,&order[i].y);
}
sort(order+1,order+1+m); //按时间先排序,时间相同时比较店铺编号
for(int i=1;i<=m;)
{
int j=i;
while(j<=m && order[i]==order[j]) j++; //第j的订单是不相同的,但是第i个订单没有算上,相当于补到第j个订单处
int t = order[i].x,id = order[i].y;
int cnt = j - i; //订单数为i ~ j - 1 故为 j - 1 - i + 1 = j-i;
i = j;
//更新优先级
f[id] -= t - last[id] - 1; //t时刻有订单了。last[id] = 2,t=5,中间经历了 3 4两个时刻
if(f[id] < 0) f[id] = 0;
//更新是否还在优先缓存中
if(f[id] <=3 ) st[id] = false;
//更新 f[id] last[id]
f[id] += 2 * cnt;
last[id] = t;
if(f[id] > 5) st[id] = true;
}
//最后 T时刻统一处理
for(int i=1;i<=n;i++)
{
if(last[i] < T)
{
f[i] -= T - last[i];
if(f[i] <=3) st[i] = 0;
}
}
int res = 0;
for(int i=1;i<=n;i++)
res += st[i];
printf("%d",res);
return 0;
}