​题目链接​

比赛时就搞了个C,赛后补了A B

A : 给你一个环形的跑道,长度为了,有n个人站在跑道上,当跑步开始时,每个人会以相同的速度顺时针或者逆时针(等概率)行进,当两个人相撞后,他们会继续原来的方向前进。现在问你,t 时间后,相撞次数的期望是多少。

如果两个人往同一个方向前进的话,肯定就无法碰到了,只要是相反方向就肯定会碰到(只要时间足够),可以看出,两个人碰到后,就开始一圈圈重复了,所以大致的做法如下

相遇的次数可以表示为一个式子

 (2*t - x) / L + 1  

x是两个点之间的距离 

接着化简 , 试着把x独立出来 , 即 

(2*t - 2*t%L + 2*t%L - x + L ) / L

然后是2*t/L + (2*t%L-x+L)/L

所以可以看出,任意两个点都会相撞2*t/L次,至于能不能多撞一次,要看2*t%L >= x 是否成立。 

统计多余的一次碰撞的时候可以维护一个指针扫描过去。。。。

​http://codeforces.com/contest/309/submission/3736059​

B题:好题一枚。。。

给你n个字符串,要你输出若干个连续的字符串,总的字符串个数最多,而且能按照要求输出。

要求是不超过R行,每行的字符个数不超过C个(包括每两个字符串中间的空格)

对于从i位置开始的字符串,我们要能知道R行最远能到哪里,那首先先解决这样一个问题:从某个字符串往后,C个字符最远能到哪(即可以用来输出一行),这个比较简单,直接搞个变量根据单调性不断地往右移动就好了。

现在,我们知道了每个字符串往后,输出一行,最远能到达的位置,那如果要知道输出2行,3行最远到哪怎么办,暴力的复杂度是n^2的,显然不行,考虑倍增思想,

f[i][j]表示从第i+1个字符串开始,输出 2^j行最远能到达的字符串位置,那么比如我们要知道第i个字符串往右15行最远能到达的位置可以这样子,先找到第i个字符串往右8行最远能到达的位置(8=2^3),再接着找这个位置往右4行最远能到达的位置,然后找当前位置往右2行,再是往右一行,就是利用二进制的思想。。。

输出的时候暴力输出就好了,细节问题整了好久啊

​http://codeforces.com/contest/309/submission/3735302​

C题:坑题一枚。。。

比赛的时候被黑两次,所幸最后过了,,,

就是二进制拆分,然后贪心,先把B数组中小的放到A中大的里面,如果直接将2^4的放到一个16的容器里面,会导致其他没法放了

​http://codeforces.com/contest/309/submission/3730640​


Summary : 最近概率,期望的题目出现的频率有点高,以后要加强这方面的练习了,B题其实如果用倍增法结果类似的题就应该能做出来的,我还做的不多。。。