TCO13 Round 1B 题解

TCO就不能白天比吗……看来今年是参加不了了……


250pts:

题意:有N个人(N为偶数),每个人有一个能力值。现在要把N个人分为(N/2)组,每组的能力值为组内两人的能力值之和。求能力值最大的组的能力值减去最小的组的能力值的最小值。

分析:贪心,将所有人的能力值排序后每次取两端的组成一组,统计最大最小值做差就是答案。

证明很简单:考虑四人a,b,c,d,能力值为k[a]<k[b]<k[c]<k[d]。按照贪心算法应该是{a,d}、{b,c}在一组,如果不是这样分组,那么只有{a,b},{c,d}和{a,c},{b,d}两种情况,首先{a,b},{c,d}肯定不如{a,d},{b,c}优。而k[a]+k[c]<k[a]+k[d]<k[b]+k[d]且k[a]+k[c]<k[b]+k[c]<k[b]+k[d],所以{a,c},{b,d}也不如{a,d},{b,c}优。


500pts:

题意:有一个N*N的棋盘,有些格子上有雕像。现在一次操作可以移去连续不超过R行上的所有雕像,或者移去连续不超过C列上的所有雕像。求最少操作次数,使得棋盘上没有剩下的雕像。N≤15。

分析:首先如果确定了要操作哪些行,那么操作次数是可以简单计算出来的。先计算行的次数(贪心),然后求出棋盘上剩下的雕像的位置,再用列贪心地覆盖。于是2^N枚举行就好了……


1000pts:

题意:对一个字符串可以进行一种操作:选择一个长K的前缀(K为偶数)将其翻转。给定N个字符串,如果两个字符串可以各通过若干次操作使得两个字符串变成同一个字符串,那么就可以删去这两个字符串。求最后剩下的最少字符串数。

分析:假设我们可以判断两个字符串是否能变成同一个,那么只要贪心删掉就好了。现在考虑怎么判断字符串是否能便从同一个。

我们考虑操作对字符串的影响。事实上,一个字符串左端点为奇数右端点为偶数的任意区间都可以被翻转。以区间[l,r]为例,可以先翻转[1,r]再翻转[1,l-1]再翻转[1,r]。那么如果我们把字符串偶数位置上的字符和其左边的字符视为一个字符(无视顺序,因为这两个字符的位置可以通过刚才的方法调换),那么只要两个字符串的“字符”相同即能消去。按这个方法判断再贪心即可。

你可能感兴趣的:(topcoder)