精选CF大水题十题,之所以说是大水题应该比一般的水题难一点也就大一点。
一、cf 144 D Missile Silos http://www.codeforces.com/problemset/problem/144/D
spfa但要扫描点扫描边
二、cf 141 C Queue http://www.codeforces.com/problemset/problem/141/C
构造题,我的方法是先构造一个合法序列然后再为为剩下的值赋值,构造的身高在n以内。
三、cf 138B Digits Permutations http://www.codeforces.com/problemset/problem/138/B
贪心,先枚举末尾为10的各种组合,然后找前面最多的9个数,要注意无法枚举到10的时候。
四、cf 137E Last Chance http://www.codeforces.com/problemset/problem/137/E
线段树,v<2*c,先统计cnt[i][k]表示长为i的前缀中原音和辅音的个数,然后两i,j,如果2cnt[i-1][2]-cnt[i-1][1]<=2cnt[j][2]-cnt[j][1]就是个好子串。
这样对arr[i] = 2cnt[i-1][2]-cnt[i-1][1]进行排序,然后找比它大的最大下标。
五、cf 128A Statues http://www.codeforces.com/problemset/problem/128/A
搜索。因为石像每次都要向下滚一格,那么可想而知后面几s它们都在哪里。先预处理出后面9s哪里可以走哪里不可以走,然后进行搜索。
六、cf 128B String http://www.codeforces.com/problemset/problem/128/B
优先队列应用。题意是要让我们找第k大的子串,因为k<=10万,所以可以用优先队列进行模拟,最开始先存入1个字符,因为最大的肯定是1个字符,然后出队再将出队的那个字符的下个合并,比如abc,先进a,b,c,然后a先出,接着ab进,就这样反复模拟...
七、cf 128C Games with Rectangle http://www.codeforces.com/problemset/problem/128/C
组合数学+DP。朴素的O(n*m*k)的DP很好想,但是复杂度太高TLE。先要想清楚,这题长和宽实际上是相互独立的,那么就可以用乘法原理,将长边算出来的方案数*宽边算出来的方案数。算长边的方案数可以用O(n*k)的DP计算。状态转移方程:dp[i][j] = dp[i-2][j-1] + 2*dp[i-3][j-1]+3*dp[i-4][j-1]...(n-1)*dp[i-n][j-1],然后进行优化,像这种可以从前面连续的状态转移过来的dp似乎都可以加个sum,然后dp[i][j] = sum + dp[i-1][j-1];
八、cf 218B. Special Offer! Super Price 999 Bourles! http://www.codeforces.com/problemset/problem/219/B
构造题。我一开始是从小往打构造,马上发现错了。然后就从大往小构造,方法是每次都把最后一位变成9,如果最后一位是9那么不调整,如果不是9那么前一位要减一,直到小于最小的数。
九、cf 218C. Color Stripe http://www.codeforces.com/problemset/problem/219/C
贪心或者DP,我是用贪心。先特判k==2的情况,这时候就两种情况要么奇数位为A偶数位为B,要么奇数位为B偶数位为A,答案是两种中转变次数较小的。k != 2的时候,就从前往后遍历,找一整块相同的字母,然后把第2,4...变成和后面一个不一样的字母即可,因为颜色大等于3,那么肯定可以找到一种和当前颜色不一样又和后面一个颜色不一样,而这样显然是最优方案。这题有人用O(n*m*m)的DP去写,我觉得很神奇,这样最多的运算量是3亿多。
十、cf 218D. Choosing Capital for Treeland http://www.codeforces.com/problemset/problem/219/D
树形DP。这题有个很巧妙的转换,那就是把边的方向转变成边权,如果正向那么边权威0,如果反向,那么边权为1.经过这样转换,问题就变成求以某点为根到其他各点的边权总和,然后求边权总和最小的那些点。这类树形DP很经典,做法是先以某点为根向叶子节点遍历,然后再以前面那点为根向下更新答案。
本文ZeroClock原创,但可以转载,因为我们是兄弟。