A |
Maximum in Table |
B |
Painting Pebbles |
C |
Sums of Digits |
D |
Restoring Numbers |
E |
Pretty Song |
F |
Progress Monitoring |
总结
1. B题一开始有些马虎,没有读完题就开始做,结果理解错题意WA了一次(样例居然还是一次就过的…)。以后要把题目读完再开始做。这种做法虽然在读题上花费的时间多了,但却节省了更多的做题时间,所以我认为这是很有必要的。
题解
A. Maximum in Table
i=1 或者 j=1, a[i][j]=1; 否则,a[i][j]=a[i-1][j]+a[i][j-1]。
求a数组中最大的数。
很明显,答案就是组合数C[n][n].
B. Painting Pebbles
有n堆石头,第i堆里有a[i]个石头。现在要你把石头染色。
一共有k个颜色。要求对于某个特定颜色c,它在任意两堆的数目差不能超过1。
求可行方案。
简单题。
这题我的想法是对于每堆石头,都从1开始染,染到k之后又从1开始染。有了这个想法之后就可以发现,要满足要求,则max{a[i]}-min{a[i]}必须小于等于k。有了这个想法之后,就可以开始写代码了。
D. Restoring Numbers
C[i][j]=(a[i]+b[j])%k.
现在给你一个W数组,让你判断W是否可以是一个C数组。如果可以,请输出可行解。
第i行与第i-1行相减后就可以得到a[i]-a[i-1]的两个值,这两个值相差k。利用这一点就可以求到k。若是相减后得到超过两个值,那么W就不是C数组,输出”NO”即可。若是只能得到一个值,那么就让k=0x7fffffff就行了。
列的操作与行类似。
最后,我们还需要判断k是否是大于W数组中的元素。如果小于其中任何一个,那么W就不是C数组。
输出的时候,只需要令a[1]=0,b[i]=w[1][i],然后推出a[i](i>=2)就行了。
E. Pretty Song
求s中的元音在所有子串中出现的期望。
这道题难处理的就是分母。
刚开始想固定分母,枚举所有元音。苦思良久,也没想到应该怎么优化。
然后想固定元音,枚举长度,但是分母不好处理。后来发现,随着长度的增加,子串的个数先是线性增加(y=x),然后是保持不变(y=min(i,|s|-i+1)),最后是线性递减(y=-x+len+1)。把这三个函数除以x之后就变成y=1, y=min(i,|s|-i+1)/x, y=-1+(len+1)/x。y=1很好处理,而后面两个函数的分子都是常数,所以想到预处理出1+1/2+1/3+……+1/i的值来计算后面两个函数值的和。