Educational Codeforces Round 99 (Rated for Div. 2)

Solution

A

可以发现, f ( f ( x ) ) f(f(x)) f(f(x))也就相当于把 x x x末尾的所有 0 0 0给去掉得到的数,即 x f ( f ( x ) ) \frac x {f(f(x))} f(f(x))x x x x在十进制意义下的 l o w b i t lowbit lowbit

所以,答案就是 n n n的位数,即读入的字符串的长度。

B

考虑一共进行了 k k k秒,由 1 , 2 … … k 1,2……k 1,2k中的一些数变成 − 1 -1 1组成 n n n。可以发现,从一个数 p p p变成 − 1 -1 1相当于减去了 p + 1 p+1 p+1

首先,我们通过二分求出最小的 k k k,使得 ∑ i = 1 k i ≥ n \sum_{i=1}^k i≥n i=1kin。如果 ∑ i = 1 k \sum_{i=1}^k i=1k n n n的差为 1 1 1,那么我们不得不在末尾添加一个 − 1 -1 1;否则的话,假设它们的差为 p p p,我们就把 p − 1 p-1 p1给改成 − 1 -1 1;特别的,如果 p = 0 p=0 p=0,就啥也不加。

综上所述,差为 1 1 1就输出 k + 1 k+1 k+1,否则输出 k k k

C

一个比较显然的贪心策略。

对方打你你就别还手;但是如果你只有 1 1 1的耐力了,那就打回去,这样虽然自己赢的数量没有变化,但是让对方胜利的次数少了 1 1 1

即,输出的分别是 x − 1 x-1 x1 y y y

D

看到数据范围,可以发现这是一个裸的 d p dp dp

状态设计: d p i , j , k : dp_{i,j,k}: dpi,j,k: 看到了第 i i i个数,当前的 x x x j j j,且第 a i a_i ai个数是 k k k

对于 d p i , j , k dp_{i,j,k} dpi,j,k的状态转移:
①如果 k = a i k=a_i k=ai,那么看到了这个数 i i i之后 x x x并没有变,但是上一个数 ( a i − 1 ) (a_{i-1}) (ai1)可以是任何不大于 k k k的数。即状态转移为 d p i , j , a i = min ⁡ p = 0 a i d p i − 1 , j , p dp_{i,j,a_i}=\min_{p=0}^{a_i} dp_{i-1,j,p} dpi,j,ai=minp=0aidpi1,j,p

②如果 k ≠ a i k≠a_i k=ai,那么在看到上一个数之后 x x x的值必须是 a i a_i ai,即这里的 k k k;经过了这一个数之后, x x x的值与 a i a_i ai交换,即 j = a i j=a_i j=ai。但是上一个数的值并不确定,所以可以得到状态转移 d p i , a i , k = min ⁡ j = 0 k d p i − 1 , k , j dp_{i,a_i,k}=\min_{j=0}^k dp_{i-1,k,j} dpi,ai,k=minj=0kdpi1,k,j

时间复杂度 O ( n 3 ) O(n^3) O(n3)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值