Educational Codeforces Round 131总结
比赛地址
比赛情况
排名:99 / 23733
AC:4 / 6
题目总结
A
看一下有几个1,0个就0,4个就2,否则1
B
\(d=2\) 显然最优。
于是从 1 到 \(n\) 判断,如果此数还未输出就输出它和它的2倍和它的2倍的2倍,直到大于 \(n\),标记为出现过,然后遍历下一个数。
C
双指针
首先把每个人擅长的工作都交给它做,那么每个人完成时间都可以化为数轴 \([1,m]\) 上的一个点。
然后跑双指针,一个从 1 开始从小往大,一个从 \(m\) 开始从大往小,寻找当前完成时间最短和最长的工人,最短+2,最长-1,然后继续跑,直到两个指针交汇就是答案
D
对于当前 \(i\) 和 \(b_i\),我们可以求出 \(a_i\) 的范围:
- 若 \(b_i=0\),则 \(a_i\in[i+1,n]\)
- 若 \(b_i=0\) 不成立,则 \(a_i\in[\left\lfloor\dfrac{i}{b_i+1}\right\rfloor+1,\left\lfloor\dfrac{i}{b_i}\right\rfloor]\)
把所有 \(a_i\) 的区间求出来后,就转化为经典问题,每个数只能在区间中取,每个数只能出现一次。
然后贪心解决,把所有区间按左端点排序,从 1 到 \(n\) 遍历,逐个确定。
如果当前区间左端点大于当前要确定的数,右端点加入小根堆。
每次从优先队列中取出堆顶,就是这个数对应的答案。
本文来自博客园,作者:zhangtingxi,转载请注明原文链接:https://www.cnblogs.com/zhangtingxi/p/16461488.html