题目
思路:
优化:可以不循环没有订单的时间,只要记录下上一次订单的时间,用这次有订单的时间减去即可。
有订单时,记录多长时间有订单,加上优先级。
写题时注意写伪代码,有助于写题。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
int n, m, T;
int score[N];// 代表每个店的优先级
int last[N];// 代表每个店最后一次有订单的时间
bool st[N];// 代表这个店是不是 优先缓存
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);//按照 x 进行排序
for (int i = 0; i < m;)
{
int j = i;
while (j < m && order[j] == order[i]) j ++ ;//当 order[j] 和 order[i] 的 x 和 y 都相等时,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;// 优先级不会小于 0
if (score[id] <= 3) st[id] = false; // 以上处理的是t时刻之前的信息
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];
printf("%d\n", res);
return 0;
}