P1668 [USACO04DEC] Cleaning Shifts S
一天有 T(1 ≤ T ≤ 106) 个时段。约翰正打算安排他的 N(1 ≤ N ≤ 2.5 × 104) 只奶牛来值班,打扫打扫牛棚卫生。每只奶牛都有自己的空闲时间段 $ S_i,E_i$,只能把空闲的奶牛安排出来值班。而且,每个时间段必需有奶牛在值班。
那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的方案,就输出 −1。
输入格式
第 1 行:N,T。
第 2 到 N + 1 行:Si,Ei。
输出格式
一行,输出最少安排的奶牛数。
输入输出样例 #1
输入 #1
1 | 3 10 |
输出 #1
1 | 2 |
说明/提示
1 ≤ T ≤ 106,N ≤ 2.5 × 104,1 ≤ Si ≤ Ei ≤ T。
Update On 2023/08/08:添加了一组hack数据,详情见这里。叉掉了时间复杂度为 𝒪(nt) 的错解。
分析
很明显,这是一个区间覆盖问题。 直接贪心,每次选择覆盖最长的奶牛。
上代码(O(T)
)
1 | dist: dict[int, int] = {} |
(有意可利用字典优化,或改写为C++,可进一步使用STLmap
)