Single Round Match 500
很惨烈,div1挂了一大片,div2估计也好不到什么情况去。初步分析一下,题目看起来很tricky,仔细研究后发现其实三道题都是可做的(尤其是Hard,也许是因为Easy和Medium耗时间太多,导致选手们普遍没有时间去做Hard吧)。
250pt MafiaGame
n个公民举行选举,每个人有自己的偏好。选举分许多轮,每一轮每个公民如果自己的偏好没有被开出局,那么就按照自己的偏好投票,否则投票数最少的人(如果有多个票数最少的候选人那么随机选一个)。然后得票最多的候选人晋级下一轮,其他候选人出局,直到只剩一个候选人为止。求所有候选人当选的最大的概率是多少。
我的算法十分brute-force……提交时150分,还不算太慢。算法就是枚举每个候选人,按照题意模拟,直到只剩一人或轮数过多时终结。碰到随机情况时,可以用票数 / 总人数算出当前候选人晋级的概率,乘起来更新答案。最慢的点1.5s,一不小心就超时了……
标准算法是这样的:在第一轮选举过程中,没有主见的公民可以忽略掉(因为这些公民都会投0票的候选人,除非所有候选人都得1票,否则这些无主见人士是不会对答案造成任何影响的)。然后在以后的每一轮中,偏好没有被踢出局的公民依然会投他所偏好的候选人,其他公民会优先投票数低的候选人,这样所有候选人的票数之差不会大于1,所以恰好有n % m个候选人晋级(n表示总人数,m表示没有被踢出局的候选人个数),无论哪个候选人晋级,其当选的概率都等于1 / 第一轮后没有被踢出局的候选人数。如果某次n % m = 0,这就意味着这一轮没有任何一个候选人被淘汰,以后的所有轮也不会有任何候选人被淘汰,所以这种情况返回无法完成选举过程。否则m会不断减小,直到1为止。如果m能够成功减到1,那么就返回答案。
500pt FractalPicture
一个500层的分形,求其落在某个矩形内的线段总长度。
很tricky……参数明明可以是double,却偏要用int,这明摆这是坑爹的……每次分形时长度都会除以3,81->27->9->3->1->1 / 3,等长度到达1 / 3时,要么这一层全在矩形内,要么全在矩形外,所以可以直接累加答案了,所以可以直接暴力,复杂度3 ^ 5。
1000pt ProductAndSum
求所有数位和等于S,且所有数位积等于2 ^ p2 * 3 ^ p3 * 5 ^ p5 * 7 ^ p7的数字个数模一个大质数的值。
先搜出来0 ~ 9每个数字的数量,然后枚举位数i,枚举这一位的数字j,对答案产生的贡献就是10 ^ i * j * P(cnt[1], ..., cnt[j - 1], cnt[j] - 1, cnt[j + 1], ..., cnt[9]),其中cnt[k]表示数字k出现的次数,P(a, b, c, ...) = (a + b + c ...)! / (a! * b! * c! ...),再就是可以把i合并省掉一层循环变成11111111... * j * P(cnt[1], ..., cnt[j - 1], cnt[j] - 1, cnt[j + 1], ..., cnt[9]),除法可以用逆元做。