马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
外卖店优先级
题目形貌
"饱了么"外卖系统中维护着 NN 家外卖店,编号 1
∼ NN。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。
每颠末 1
个时间单元,如果外卖店没有订单,则优先级会减少 1
,最低减 到 0࿱
b;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中࿱
b;如果 优先级小于即是 3,则会被清除出优先缓存。
给定 TT 时刻以内的 MM 条订单信息,请你计算 TT 时刻时有多少外卖店在优 先缓存中?
输入形貌
第一行包含 3 个整数 N,M,TN,M,T。
以下 MM 行每行包含两个整数 ts,idts,id,表示 tsts 时刻编号 idid 的外卖店收到一个订单。
其中,1
≤N,M,T≤1
05,1
≤ts≤T,1
≤id≤N1
≤N,M,T≤1
05,1
≤ts≤T,1
≤id≤N。
输出形貌
输出一个整数代表答案。
输入输出样例
示例
输入
输出
样例表明࿱
a;
6 时刻时,1
号店优先级降到 3,被移除出优先缓存࿱
b;2 号店优先级升到 6, 加入优先缓存。所以是有 1
家店 (2 号) 在优先缓存中。
运行限制
- 最大运行时间࿱
a;2s
- 最大运行内存: 256M
总通过次数: 4046 | 总提交次数: 6740 | 通过率: 60%
难度: 中等 标签: 201
9, 模拟, 省赛
方法思路
题目要求计算在T时刻处于优先缓存中的外卖店数量。外卖店的优先级随时间变革࿱
a;每过1
个时间单元无订单则优先级减1
(最低到0),有订单则每单优先级加2。当优先级>5时加入缓存,优先级≤3时移出缓存。解决思路如下࿱
a;
[list=1
]
分组处置惩罚订单࿱
a;将订单按店铺ID分组,每个店铺的订单按时间排序。
按时间处置惩罚订单࿱
a;对于每个店铺࿱
a;
- 处置惩罚无订单时间段࿱
a;计算从上一次订单到当前订单之间的时间差,更新优先级(减少)。
- 检查缓存状态࿱
a;若优先级≤3且之前在缓存中,则移出缓存。
- 处置惩罚当前订单࿱
a;增长优先级(每单+2),若优先级>5则加入缓存。
处置惩罚末了时间段࿱
a;从末了一个订单到T时刻,更新优先级并检查缓存状态。
统计效果࿱
a;遍历所有店铺,统计T时刻在缓存中的店铺数量。
- #include <iostream>#include <vector>#include <algorithm>using namespace std;int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M, T; cin >> N >> M >> T; vector<vector<int>> orders(N + 1
- ); for (int i =
- ; 0; i < M; i++) { int ts, id; cin >> ts >> id; orders[id].push_back(ts); } vector<bool> in_cache(N + 1
- , false); for (int id =
- ; 1
- ; id <=
- ; N; id++) { if (orders[id].empty()) continue; sort(orders[id].begin(), orders[id].end()); int last =
- ; 0; int pri =
- ; 0; bool cache =
- ; false; int i =
- ; 0; while (i < orders[id].size()) { int t =
- ; orders[id][i]; int cnt =
- ; 0; while (i < orders[id].size() && orders[id][i] =
- ;=
- ; t) { cnt++; i++; } int gap =
- ; t - last - 1
- ; pri =
- ; max(0, pri - gap); if (cache && pri <=
- ; 3) cache =
- ; false; pri +=
- ; 2 * cnt; if (pri > 5) cache =
- ; true; last =
- ; t; } int gap =
- ; T - last; pri =
- ; max(0, pri - gap); if (cache && pri <=
- ; 3) cache =
- ; false; in_cache[id] =
- ; cache; } int ans =
- ; 0; for (int id =
- ; 1
- ; id <=
- ; N; id++) { if (in_cache[id]) ans++; } cout << ans << endl; return 0;}
复制代码 代码表明
输入处置惩罚࿱
a;
- 读取店铺数N、订单数M和时间T。
- 使用vector<vector<int>> orders存储每个店铺的订单时间。
订单分组与排序࿱
a;
- 对每个店铺的订单时间进行排序,便于按时间顺序处置惩罚。
处置惩罚每个店铺࿱
a;
- 初始化࿱
a;last记录上次订单时间,pri记录当前优先级,cache记录缓存状态。
- 合并相同时间订单࿱
a;统计同一时间点的订单数量。
- 处置惩罚无订单时段࿱
a;计算时间差gap,更新优先级pri =
; max(0, pri - gap)。
- 检查缓存࿱
a;若优先级≤3且之前在缓存中,则移出缓存。
- 处置惩罚订单࿱
a;优先级增长2 * cnt,若优先级>5则加入缓存。
- 末了时段处置惩罚࿱
a;从末了一个订单到T时刻,更新优先级并检查缓存状态。
统计效果࿱
a;
- 遍历所有店铺,统计T时刻在缓存中的店铺数量
示例阐明
输入示例࿱
a;
- 店铺1
࿱
a;
- 订单时间࿱
a;[1
, 2, 3]
- 时间1
࿱
a;优先级=
;2,未加入缓存
- 时间2࿱
a;优先级=
;4,未加入缓存
- 时间3࿱
a;优先级=
;6,加入缓存
- T=
;6时࿱
a;优先级=
;3,移出缓存
- 店铺2࿱
a;
- 订单时间࿱
a;[5, 6, 6]
- 时间5࿱
a;优先级=
;2,未加入缓存
- 时间6࿱
a;优先级=
;6,加入缓存
- T=
;6时࿱
a;优先级=
;6,保持在缓存
- 输出࿱
a;1
(店铺2在缓存中)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao1
23.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |