AtCoder Regular Contest 059

题目链接

C - Be Together

200 200 200分 结论

直接取所有数的平均数,由于需要是整数,所以算一下 m i d , m i d + 1 , m i d − 1 mid,mid+1,mid-1 mid,mid+1,mid1,取最小值即可。

代码

D - Unbalanced

400 400 400分 结论

不难发现如果有一段是合法的那么一定存在长度为 2 2 2或者 3 3 3的串合法,直接找即可。

代码

E - Children and Candies

800 800 800 d p dp dp + 前缀和优化

题面太阴间了,简单解释一下。

n n n个小朋友, c c c个糖果,如果第 i i i个小朋友分了 a a a个糖果,那么他得到的快乐值是 x i a x_{i}^a xia,一个幼儿园的快乐值是小朋友快乐值乘积,定义 f ( x 1 , x 2 , . . . , x n ) f(x_1,x_2,...,x_n) f(x1,x2,...,xn)为一个幼儿园的快乐值,现在让你计算:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6J2qEfu-1645840763184)(C:\Users\Libra_Glow\AppData\Roaming\Typora\typora-user-images\image-20220226094553741.png)]

显然考虑 d p dp dp d p [ i ] [ j ] [ k ] [ p ] dp[i][j][k][p] dp[i][j][k][p] 表示到第 i i i个人,已经分了 j j j个,要分给他 k k k个,当前选了 x i = p x_i=p xi=p,转移方程也比较明显 d p [ i ] [ j ] [ k ] [ p ] + = ∑ t = 0 j − k ∑ h = a i − 1 b i − 1 d p [ i − 1 ] [ j − k ] [ t ] [ h ] dp[i][j][k][p]+=\sum_{t=0}^{j-k}\sum_{h=a_{i-1}}^{b_{i-1}}dp[i-1][j-k][t][h] dp[i][j][k][p]+=t=0jkh=ai1bi1dp[i1][jk][t][h],可以发现对于第三维和第四维我们可以使用前缀和优化掉,更进一步可以发现根本不需要存第三维和第四维,直接记 d p [ i ] [ j ] dp[i][j] dp[i][j]即可,预处理一下 [ a i , b i ] [a_i,b_i] [ai,bi]的区间取某个幂次的和即可,复杂度可以降到 O ( n 3 ) O(n^3) O(n3)

代码

F - Unhappy Hacking

800 800 800 d p dp dp

直接考虑 d p [ i ] [ j ] dp[i][j] dp[i][j]表示用了 i i i次操作,匹配到了第 j j j位,一开始没想出来,因为是将 j j j放到了第一层循环,以长度作为 d p dp dp决策的转移,也就是考虑 d p [ i ] [ j ] , d p [ k ] [ j − 1 ] dp[i][j],dp[k][j-1] dp[i][j],dp[k][j1],这样显然是不好搞的,考虑反过来,以操作次数作为决策点, i − 1 − > i i-1 -> i i1>i只进行了一次操作,显然就只有三个情况,我们依次考虑:

  • d p [ i ] [ j ] + = d p [ i − 1 ] [ j − 1 ] dp[i][j]+=dp[i-1][j-1] dp[i][j]+=dp[i1][j1] 当前操作打 1 1 1或者 0 0 0,根据第 j j j位确定
  • d p [ i ] [ j ] + = d p [ i − 1 ] [ j + 1 ] ∗ 2 dp[i][j]+=dp[i-1][j+1]*2 dp[i][j]+=dp[i1][j+1]2 当前操作选择按回退,因为我们并不关心 j + 1 j+1 j+1位是 0 0 0还是 1 1 1,所以需要乘 2 2 2

注意 j = 0 j=0 j=0的时候还需要加上 f [ i − 1 ] [ 0 ] f[i-1][0] f[i1][0]

复杂度 O ( n 2 ) O(n^2) O(n2)

代码

还有一种比较巧妙的方法,可以知道长度为 l e n len len的字符串出现的概率都相等,所有情况是 2 l e n 2^{len} 2len,所以我们如果能求出来所有的情况,除上 2 l e n 2^{len} 2len即可。

d p [ i ] [ j ] dp[i][j] dp[i][j]表示用了 i i i次操作,长度为 j j j的方案数,直接写转移了:

  • d p [ i ] [ j ] + = d p [ i − 1 ] [ j − 1 ] ∗ 2 dp[i][j]+=dp[i-1][j-1]*2 dp[i][j]+=dp[i1][j1]2 当前操作打 1 , 0 1,0 1,0,所以需要乘 2 2 2
  • d p [ i ] [ j ] + = d p [ i − 1 ] [ j + 1 ] dp[i][j]+=dp[i-1][j+1] dp[i][j]+=dp[i1][j+1] 按回退,由于 f [ i − 1 ] [ j + 1 ] f[i-1][j+1] f[i1][j+1]的方案就已经包含了 j + 1 j+1 j+1 0 , 1 0,1 0,1的两种情况,所以不需要乘 2 2 2

复杂度 O ( n 2 ) O(n^2) O(n2)

代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值