Codeforces Round #205

A. Domino

题意:给定n张牌,每张牌上分上下两部分,上下都有数字。牌可以翻转180度,即将上下数字调换,数字的值为1~6。问最少经过几次能将上面部分的和与下面部分的和都变为偶数。若不能,则输出-1。

思路:刚开始用深搜超时。我没注意到偶数的性质。其实,(1)无论牌上的两个数是什么,都可以看作0(偶数)和1(奇数),这并不影响结果;(2)上下数字调换,如果两数字奇偶性相同,对结果也不影响;(3)由结论2可以得出,最终结果只有3种情况:0,1,-1。有这三个结论(其实第一个结论只是用来来理解更第2个结论更方便一点,没什么用),假设初始时上部分和为upper,下部分和为lower,(1)upper % 2 == 0 && lower % 2 == 0,则结果为0;(2)如果upper % 2 || lower % 2,但存在一张牌,上面两个数字奇偶性不同,则结果为1;(3)不满足上面两种情况,为-1。


B. Tow Heaps

题意:给定n(n范围1~100),及2 * n个数(数字范围10 ~ 99),将这2 * n个数平分成两堆,假设第1堆的数字为ai(1 <= i <= n),第2堆的数字为bj(1 <= j <= n),按aibj的顺序组成一个四位数,求能够组成的不重复的数字最多的个数,并输出第i个数所属的堆(1或2)。

思路:不重复数字最多,由要求每个堆里面,重复的数字要少,即2 * n个数中,重复的数字最好要平分在两堆里面,最终最多不重复数为两堆里面不重复数的个数之积。这个想法是对的。比赛的时候用了一种贪心策略:将2 * n个数升序排序,然后,交叉地放入两个堆,即对于num[i],如果i为偶数则放在第一堆,如果为奇数就放在第二堆。WA。赛后发现了一组数:10  20  20  20  30  40  40  40。如果用这种策略,那么第一堆的数为:10  20  30  40 ;第二堆的数为:20  20  40  40  ;最终的不重复数为4 * 2 = 8。但这组数据,最多的应该是9,即第一组为:10  20  40  40  ;第二组为:20  20  30  40。最终为3 * 3 = 9。这种策略并没有将重复的数均分在两组中。

正确的思路应该是:(1)将2 * n中重复的数字在两堆里面各放一个,剩下的转到下一步;(2)将不重复的数字在均分在两堆里(当然,可能会出现其中一个堆多一个的情况,这并不影响结果),剩下的转到下一步;(3)剩下的随意放,只要每堆个数填满n就行了。


C. Find Maxinum

题意:n(n范围为0~100000)个数字b0,b1,...,bn-1(bi均为正数)及,x为[0,2 ^ n - 1]之间的一个数,bit(i)表示,x转化成二进制后从右边起第i位数(0或1)。现在给定二进制数字s0s1...sn-1,设m =。x为[0...m],求f(x)的最大值。

思路:我们从大到小,并转化成二进制一位一位考虑,假设m转化为二进制为an-1an-2...a0,我们从最高位开始考试,那么有两种情况:(1)an-1为0,那么,最高位可以省略了,m可以更新为an-2an-3...a0,x的范围就是新的m了;(2)an-1为1,这时,f(x)的值有两种,最高位保留:bn-1 + f(x)的最大值,x为[0,m - 2 ^ (n - 1)];最高位不保留:此时,x为[0,2 ^ (n - 1) - 1],毫无疑问,x取an-2an-3...n0全部设为1,能使f(x)为最大值。那么,最大值就从这两种里面取。


D. Queue

题意:给定长度为n(1~10^6)的字符串,字符串只包含F和M两个字母,每一秒种,F可以跟它左边相邻(若存在的话)的M调换位置,问将F全部调换到M左边所需要的最少时间。如MFMF最少需要2秒转化成最终的FFMM。

思路:由题意易知,只要求最后一个F调换到所有M的左边所需要的时间就行了。考虑第j个F,设它的位置为i,它被调到最终位置的时间为tj,我们来看tj同tj-1及位置i的关系:(1)t[j]至少为t[j - 1] + 1;(2)t[j]至少是此时位置i与最终位置itmp之差i - tmp。且t[j]不会超过这两个中的最大值,因为取最大值,即已经移动到最终位置,不用再移动了,所以取t[j] = max(t[j - 1] + 1, i - itmp)。需要注意的的是初始时最左边有F,那些这些F需要略过。


E. Antichain

还没做,等来日补上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值