卡壳点:n m弄反了,结构体没有正确排序导致卡壳。之前一直强调解题不要跳步,要按照必要流程走一遍,结果还是一直出错,突然意识到这就像在错题本错误原因上写粗心大意一样,解决不了问题,还得要再系统总结一次并放在一起记忆,做题时按照记忆的步骤走一遍。
AcWing 1241. 外卖店优先级 - AcWing
// 9:50~10:08 // 15:04~15:21 // 没有固定范围,所以不属于滑动窗口 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; typedef pair<int,int> PII; const int N = 1e5 + 10; int last[N],v[N]; bool st[N]; PII f[N]; int main(){ int n,m,t; cin >> n >> m >> t; for(int i = 0; i< m;i++){ int a,b; scanf("%d%d",&a,&b); f[i] = {a,b}; } sort(f,f+m); for(int i = 0;i < m;){ int j = i; while(f[i] == f[j] && j < m) j++;// 必定动一次,所以后面的cnt=j-i而不是j-i+1 int cnt = j - i,id = f[i].second,time = f[i].first; i = j; v[id] -= (time - last[id] - 1); // cout << v[id] << " " << id << endl; // cout << cnt << endl; if(v[id] < 0) v[id] = 0; if(v[id] <= 3) st[id] = false; v[id] += cnt * 2; if(v[id] > 5) st[id] = true; last[id] = time; // cout << v[id] << " " << id << endl; } for(int i = 1;i <= n;i++){ v[i] -= t - last[i]; if(v[i] <= 3) st[i] = false; } int ans = 0; for(int i = 1;i <= n;i++){ if(st[i]) ans++; // cout << i << endl; } cout << ans << endl; return 0; }