20190809B组

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值