Codeforces Round 1132Educational Round 61
Posted denverjin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round 1132Educational Round 61相关的知识,希望对你有一定的参考价值。
Codeforces Round 1132
这场比赛做了(A)、(B)、(C)、(F)四题,排名(89)。
(A)题(wa)了一次,少考虑了一种情况
(D)题最后做出来,但被(hack)了。。。被(hack)的原因是没有想到答案会超过(10^{12})(毕竟这个时间上的优化也是在最后迫不得已的情况下加的,就没有考虑正确性。。。
Codeforces 1132 C
题意:给一些区间([l_i,r_i]),从中删掉两个,求剩下的区间最多能够覆盖的格子数量。
思路:首先枚举第一个删掉的区间,然后我们可以通过差分来求出每个格子被多少个区间覆盖了,随后求出所有格子中被(1)个区间覆盖的数量的前缀和,再枚举第二个删掉的区间,找删掉的(1)个区间覆盖的最少的即为答案。
Codeforces 1132 D
题意:给(n)个电脑的电量和耗电速度,你可以买一个充电器,它的充电速度是每秒(v)单位,(v)你自己定。问最小的(v)能使得在(k)秒内每秒给某电脑充电,没有电脑的电量小于(0)。
思路:首先二分(v),然后(check)的时候是这样的:
维护每一个电脑没电的时间,每次将最早没电的那个给充电一秒,如果最早没电的那个在充点前已经没电了,那么就肯定完蛋,否则一直跑到第(k)秒看是否能跑完。
Codeforces 1132 E
题意:给(cnt_i)个(i)((1leq ileq 8)),问用这些数所能构成的最大的不超过(W)的数。
思路:随机+贪心。。。
我们考虑将贪心和一个奇奇怪怪的随机算法结合在一起取最大值。
贪心:我们枚举所有的(8)个数的排列,然后将第(i)个数尽量取到能取的最大值,加入答案。
随机:首先我们考虑约束条件(t)。(t)从(1)开始,然后逐步收敛为(t imes0.999999),(t imes0.999999^2)、。。。
然后我们随机地考虑一个数(i),再看如果当前的数超过了(w),那么我们肯定要将(i)取的个数压下去,则随机([0,nowchosen_i imes t])中的一个作为新的(i)取的个数。否则我们需要将(i)取的个数加上去,则随机(nowchosen_i+[0,(cnt_i-nowchosen_i) imes t])中的一个作为新的(i)取的个数。
最后取这两种方法的(max)即可。
Codeforces 1132 F
题意:给一个串(S),问每次删除连续的一段相同字母,最少删几次将原串删空。
思路:考虑区间(dp),我们看要删多少次能把([l,r])删空,那么最终答案就是(dp[0,n])。
那么就枚举最后一次删除的字符是(c)。
由于我们可能有(ababa)这种情形,不一定只是(c-)段间隔起来的区间们需要被单独处理,而是可能是连续的几段,头尾是(c-)段即可。
那么就需要另一个(dp)。设(f(i))表示到了第几个(?-)段,然后转移到(f(i+j)),需要在值上加上(dp[i+1,i+j-1])。
然后用(f(r))更新(dp[l,r])就好辣
Codeforces 1132 C 分析
tataky:
首先我们将所有的互不包含的区间们放在(v)里,然后看被包含的区间有多少,如果超过2个就直接输出答案,否则需要通过(dp)来求:
首先我们考虑(dp)的状态。那么首先我们需要记录删掉了多少个区间((0..2)),还要看现在已经到了第几个按顺序排列的区间,并且如果删除的是连续的两个区间,还要存前一个没被删掉的区间在当前的区间前面多少个。
所以(dp(i,j,k))表示现在到了第(i)个区间,然后已经干掉了(j)个区间,现在连续地删掉了(k)个区间,最多可以覆盖的格子个数。
考虑转移。我们考虑第(i)个区间是否被删掉,如果删掉,那么转移到(dp(i+1,j+1,k+1)),否则转移到(dp(i+1,j,0))。
V--gLaSsH0ldEr593--V、neal、kmjp:
和我的思路差不多,是首先用差分求每一个格子被多少个区间覆盖了,然后考虑枚举第一个删除的区间,看将它删去之后所覆盖只被一个区间覆盖的格子数量最少的区间,这就是第二个区间。只需要处理一下被一个区间覆盖的格子数量的前缀和就可以了。
以上是关于Codeforces Round 1132Educational Round 61的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 1132D - Stressful Training - [二分+贪心+优先队列]