[蓝桥杯][2019年第十届真题]外卖店优先级
题目描述
“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。
输入
第一行包含 3 个整数 N、M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到
一个订单。
输出
输出一个整数代表答案。
样例输入
2 6 6 1 1 5 2 3 1 6 2 2 1 6 2
样例输出
1
提示
对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。 对于所有评测用例,1 ≤ N,M,T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。
#include<iostream> #include<algorithm> #include<vector> #include<cstring> using namespace std; #define MAXN 100001 /* 2 6 6 1 1 5 2 3 1 6 2 2 1 6 2 */ bool cmp(pair<int, int>a, pair<int, int> b) { if (a.first == b.first) return a.second < b.second; return a.first < b.first; } int main() { int n,m,t; cin >> n >> m >> t; int temp[MAXN], score[MAXN]; bool cache[MAXN]; vector < pair<int, int>> F; for (int i = 0; i < m; i++) { int a, b; cin >> a>>b; pair<int, int> p(a, b); F.push_back(p); } sort(F.begin(), F.end(), cmp); memset(temp, 0, sizeof(temp)); memset(score, 0, sizeof(score)); memset(cache, false, sizeof(cache)); for (int i = 0; i < m; i++) { int ti = F[i].first, si = F[i].second; if (ti != temp[si]) score[si] -= ti - temp[si] - 1; score[si] = score[si] > 0 ? score[si] : 0; if (score[si] <= 3) cache[si] = false; score[si] += 2; if (score[si] > 5) cache[si] = true; temp[si] = ti; } for (int i = 1; i < n+1; i++) { if (t > temp[i]) { score[i] -= t - temp[i]; if (score[i] <= 3) cache[i] = false; } } int res=0; for (int i = 1; i < n+1; i++) { if(cache[i]==true)res++; } cout << res; return 0; }