Intel Code Chanllenge Elimination Round

题目链接代码链接

A题在自己知道坑的情况下还是挂了,D题在最后五分钟想出思路,又一次懵逼,没有时间敲完。。。

*A Broken Clock

题意是给出表的12计时方式与24计时方式,12计时方式时钟在112的范围内,分钟在059的范围内。24计时方式时钟在023的范围内,分钟在059的范围内。问改动最少的数字,使得给出的时间符合要求。

注意12计时方式下的20:00这种情况,不是变成01:00而是10:00。。。。

B Verse Pattern

算每一个字符串数组中的元音字符数量是否与给定的数相等。。。

C Destroying Array

给定一个数组,每次删掉一个数字,问每次删掉之后剩下的连续数字的最大和。

反过来考虑就是添加数字,每次添加用并查集来合并左右数字,维护最大值。

*D Generating Sets

题意是有不同的n个数,可以任意选一个数x,有两种操作,1.x2之后放回去。2.x2+1之后放回去。经过若干次这样的变换之后,变成了给出的数组,要求就是找回最开始的n个数,使得这n个数里面最大的数最小。

实际上是一颗二叉树,每一次选最大的数除以2,看可不可以占这个位子,不能的话再往上找,直到找不到向上的路径了。

别人都是set就过了,我非得搞个优先队列+map。。。mdzz。

*E Research Rover

nm的格子,一开始站在(1,1)的点上,有S的油量,现在有一些点会让油量减半,问最终到达(n,m)这个格子所剩油的期望。化简之后分数表示成PQ,给出PQ1的结果,其中Q1代表Q109+7的逆元。

首先结果的分数是不用考虑化简的,因为假设PQ都有公约数d,那么
PddQd1d1=PQ1
所以Q就是从(1,1)(n,m)的方案数,P即是所有情况下到达的油量总和。

这道题还要发现一点就是S最大值是106,也就是说如果经过了超过20个消耗点,那么就会一直是1了。所以只需要考虑小于等于20个消耗点的情况。

这样的话和51nod上大大走格子(这个也是codeforces上的。。。)思路就类似了。dp[i][v]表示第v个点到终点经过i个消耗点的方案数量。从后往前考虑,等于
dp[i][v]=C(n+mxvyv,nxv)j=v+1kC(xj+yjxvyv,xjxv)dp[i][j]j=0i1dp[j][v]
解释一下上面的式子,C(n+mxvyv,nxv)是该点到终点的方案总数,减去前面的点经过i个点了乘以它到这里的方案数,这块和大大走格子的思路是一致的。这一部分等于它到终点经过0i次的,减掉之前的,就是该点经过i个点的方案数。最后是(1,1)这个点的方案数乘以油量。

最后考虑经过的数量大于20的情况,C(n+m2,n1)减去之前算出来的方案数就是剩下的情况,乘以1,添到结果内。

最后这个题卡常,算逆元的话最好用递推式:
inv[i]=(ModModi)inv[Mod

F Cyclic Cipher

题意是给出了n个序列,每个序列ki(1ki40)个数,每次序列向右不断循环一位,取每个序列的第一个数再从上到下组成一个序列,算每一个数的最长连续序列,一共进行10100次,问在这些中,每个数的最长连续序列是多少。

会发现如果x在连续序列中碰到一起了,假设是在第S秒,在第i个序列中的位置为pi,第i序列的长度为ki,那么会满足下面的条件
Spi(mod ki)

Spj(mod kj)

发现这样的话就是中国剩余定理的内容,参考这个的评论,可以推出:
pi+kix=pj+kjy

pipj =kjykix

pipj0(mod GCD(ki,kj))

因为在连续序列里面的任意两个都要满足这样的关系,所以枚举右端点,更新左端点即可。