2020.12.02【NOIP提高B组】模拟 总结

2020.12.02【NOIP提高B组】模拟 总结

今天打到11点55分才交程序。

1.密码(substring)

用了三种方法。
(1)暴力 O ( n 3 ) O(n^3) O(n3)
(2)用数学直接加一个和就 O ( n 2 ) O(n^2) O(n2)
(3)设 f i , j f_{i,j} fi,j表示 i i i后面字符 j j j的位置,转移,然后跳一下,时间 O ( n m ) O(nm) O(nm)
应该可以过。
后面对拍发现傻逼错误,花了30分钟。
正解:
如上。
用类似 d p dp dp法。
每次都跳一下。
每次都只会经过 m m m个点,所以单次为 O ( m ) O(m) O(m)
总结:
这种题目可以一看就是 O ( n m ) O(nm) O(nm)
可以知道它是用加法原理或者求方案数的一些数学方法。
然后就可以打出 O ( n 2 ) O(n^2) O(n2)
接着,因为 m m m很小,我们尝试只遍历串 B B B,所以用链表。
敲代码时要想后再打。

2.Adore

暴力 2 m 2^m 2m枚举变不变,20分。
然后用 d p dp dp求路径数。
应该是 d p dp dp
正解:
以下状态就是路径数奇偶性的状态
f i , j f_{i,j} fi,j表示在第 i i i层状态为 j j j的方案数, h ( i ) h(i) h(i)表示二进制 i i i 1 1 1的个数是否为奇数。
对于第 i i i层,我们设 a i a_i ai表示不取反去下一层的状态, b i b_i bi表示取反后去下一层的状态, p p p为取反下一行的状态, q q q为不取反下一行的状态。
可知 p = ∑ i = 1 k h ( a i & j ) 2 j \begin{aligned}p=\sum_{i=1}^{k}{h(a_i\&j)2^j}\end{aligned} p=i=1kh(ai&j)2j q q q类似。
然后转移:
f i , p = ∑ f i − 1 , j f_{i,p}=∑f_{i-1,j} fi,p=fi1,j
答案显然,就是 f n − 2 , s f_{n-2,s} fn2,s(满足路径数为偶数)。
总结:
比赛时没想到如何列状态转移方程。
下次看到 k k k这么小就可以知道是状压 d p dp dp
转移方程要看一下有什么性质,比如说 k k k个路径数因为必须是偶数,所以就用 0 / 1 0/1 0/1表示偶数/奇数。
知道第 1 1 1维一定是层数。
然后发现时间复杂度是 O ( n k 2 k ) O(nk2^k) O(nk2k),要卡一下常数。

3.Confess

用暴力做 n 3 n^3 n3,20分。
完全不会优化。
可能是数学。
正解:
题解说是随机算法,因为有 n n n的数保证可以。
证明用到组合数。
总结:
有时候要大胆猜结论。
遇到不会的题,打了部分分后。
分大数据和小数据处理,大数据用结论,小数据用暴力。

4.Repulsed

不会做。
可能是树形 d p dp dp
没打暴力。
正解:
树形 d p dp dp+贪心。
g x , k g_{x,k} gx,k表示 x x x子树下距离为 k k k需要的灭火器数, f x , k f_{x,k} fx,k表示 x x x子树下距离为 k k k多余的灭火器。
然后用神仙贪心即可。
总结:
不要拘束于 d p dp dp,要多想贪心算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值