这道题小吉花了一坤时才弄明白,虽然花的时间有点长
但是至少是明白了
😎😎😎😎😎😎
这道题如果纯纯用暴力,也不是不能做,毕竟是蓝桥杯的题,还是可以拿到分的,但是拿不全
下面就是优化版本
⭐⭐⭐
注意用sort为pair排序时,先比较 .first,再比较 .second,
变化位置时, .first .second 一起变化
具体可以参考下面的代码
⭐⭐⭐
代码的总体思路就是先排序,把 ts 相同的放在一起
#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];//店铺i上一次有订单的时间 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);// ts id sort(order, order + m); for (int i = 0; i < m;) { int j = i; while (j < m && order[j] == order[i]) j ++ ;//代表order[].x order[].y都对应相等 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; // 以上处理的是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; }
🍔 score[id] - = t - last[id] - 1
t 代表当前时间,last[id]代表 t 前一个的时间,因为要算出整块的时间,这样方便改变优先值
因为已经跳出while循环了,所以这一部分是没有接到订单的,所以是score[] -
为什么要 -1
比如 t = 5,last[id] = 2,那么就是 3,4两个数(5-2-1)
🍔最后一个订单怎么处理
Code over!