【Codeforces #228】Solutions
http://codeforces.com/contest/389
重新把号刷到Div 1 准备ACM?(我这么菜还是玩玩算了……)
官方题解出的很快
Div2 A: 怎么做都行……随便找俩数减就可以
Div2 B: 找上面那个'#',然后更新五个,最后检查有没有多余的'#'
Div2 C & Div1 A: 贪心即可。当然题解方法说的第i小的strength[i]>i/piles也对的。
Div2 D & Div1 B: 二进制划分。
类似这种,除去1和2之外被分成3层(层数取决于二进制位数)。设f[i]为到第i层时的方案数,那么如果红色路径存在则f[i]++。
Div2 E & Div1 C: 艾玛无望时想到了做法。。
1.首先对于某一堆,如果我(先手那个)想拿上面的一半,那我一定可以全部拿到。(奇数堆不包括中间那一个)
这是显而易见的,因为先手总可以保证在当前堆“快人一步”。但同时后手也可以保住这一堆的后半堆(如果他想)。
2.在先手当前所有决策中,因为对于每一堆的下半部分处于被动状态,所以如果下半堆价值很高,那后手可以通过优势阻止先手去拿。所以不可能出现一个人拿了超过一堆的一半。
3.这样上下半堆就分属于两个人了,中间那个怎么办?因为先手优势,先手可以“占据”某一堆的中间牌。
比如牌编号是ABC,A想要B的话,只需要把A拿走,那C就一定是自己的了。
但是每次抢中间牌的条件是拥有先手优势,当A抢了一张中间牌之后,A就没有先手优势了,所以这种抢中间牌的操作是交替的。
就完了。。
div1 DE还没看,不过看起来不像是我会做的样子……