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,2……k中的一些数变成 − 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=1ki≥n。如果 ∑ 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 p−1给改成 − 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 x−1和 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})
(ai−1)可以是任何不大于
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=0aidpi−1,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=0kdpi−1,k,j。
时间复杂度 O ( n 3 ) O(n^3) O(n3)。