20190809B组
T1:100(100)
赛时:
看完这套题就知道是一个系列的题。
不管这么多,第一题很快看出是背包。
并且数据一点都不大,轻松过掉。
算法:
背包
T2:12.5(0)
赛时:
看看数据很小,但题目有点难以用比较快速的算法完成。
为了控制时间,只好打个暴力。
其中有一个重要的剪枝没打,导致37.5->12.5。
赛后:
由于这道题的 T 很大,线性算法是过不了的,所以我们考虑矩阵乘法。
这道题图中的边权为 1~9,比较小,所以考虑拆点,为了方便表示,把编号为 i 的点拆为 i*10+1~i*10+9 一共 9 个节点。
如果 i 到 j 有一条权值为 k 的路径,那 么就把矩阵中[i*10+k,j*10+1]的值设为 1,相当于先从 i*10+1→i*10+k 走过 k-1 条长度为 1 的路径,再在 i*10+k→j*10+1 走过 1 条长度为 1 的路径,总长度为 k,跑一遍快速幂,[1*10+1][n*10+1]的值即是方案总数。
算法:
矩阵乘法&快速幂
T3:30(0)
赛时:
看到题目很像找规律,可是找了很久没推出。
只好放弃大暴力,可是这几题奇怪的没有部分分。
这样做有爆零的危险,估分也难。
赛后:
仔细分析数字的对应关系,可以发现这 N 个数会组成很多个环。
设有 K 个环, 每 个 环 的 长 度 为 l[i] , 明 显 的 , 他 们 最 终 还 原 为 原 序 列 的 排 数 为 LCM(l[1],l[2],l[3],...,l[k])。
设这个排数为 A,不妨把 A 分解质因数,令 A=p1^c1*p1^c2*...*pm^cm. 我们就会得出一个结论:p1^c1+p2^c2+..+pm^pmn,怎么都 不会达成。
所以,我们就用一个简单的 dp,f[i][j]表示前 i 个质数,总和为 j 的 方案数, 那么 f[i][j]=∑f[i-1][j-pri[i]^k],先把 n 以内的质数筛出来,再求一遍 dp,答案 就是∑f[质数总数][i]。
算法:
dp
T4:30(0)
赛时:
又好像是一道dp题,可是不管怎么推也推不出。
于是有只好打一个暴力。
本是dp专场的,被我硬生生的变成暴力专场。
赛后:
设 ans(n)为 0~n 中 windy 数的个数,求 A~B 以内的 windy 数个数,也就是求 ans(B)-ans(A-1),但是 A 和 B 很大,直接枚举会超时,怎么办?
仔细分析会发 现一个数是不是 windy 数,只跟它数位上的数有关,所以不妨设 f[i][j]表示第 i 位填 j 的 windy 数个数(第一位是个位)。
转移很明显: F[i][j]= ∑[abs(j-k)>=2]f[i-1][k]。 我们设 num[i]为 n 第 i 位的数(从高位到低位), 对于位数比 n 的位数小的 i 或第一个数字比 num[1]小的 j,ans+=f[i][j]; 对于位数等于 n 的位数的我们枚举前 k 位与 n 相等(要确保合法),再把比当前位数的数小的 j 的 f[i][j]加到答案里。
算法:
数位dp