Codeforce Global Round 8[CF1368]
D
对于每一个二进制位,无论如何操作,1的个数都是不会变化的。
假设你现在进行一次操作,原本是 $x,y(x\leq y)$,现在变成了 $x-z,y+z(z\leq 0)$,那么贡献的差就是 $(x-z)^2+(y+z)^2-(x^2+y^2)=2(y-x)z+z^2\geq 0$。
也就是最大值越大越好。那么从大到小,对于每一位贪心即可。
1 | int n,x,cnt[21]; |
E
占坑。
F
一道不错的交互题。
我们用 $1$ 表示环上的这个灯是亮着的。
我们先来看看如何算出 $R(n)$。首先,假设环上已经有了 $m$ 个点,你现在考虑加 $x$ 个点进去。如果要产生贡献的话,这 $m+x$ 个点所连成的最大连续的段的长度最多是 $x-1$。也就是说,这些连续段最多有 $\left \lceil \frac{m+x}{x-1} \right \rceil$ 段,也就是 $0$ 的个数最少要有 $\left \lceil \frac{m+x}{x-1} \right \rceil$ 个。那么列出不等式:$m+x+\left \lceil \frac{m+x}{x-1} \right \rceil\leq n$。
解得 $m\leq n-\left \lceil \frac{n}{x} \right \rceil-x$。
由于 $m$ 此时还能产生贡献,那么 $R(n)$ 就等于 $m$ 的最大值加 $1$。
这时候我们算出了一个 $x$,表示每次操作后不能使得有一个段的长度大于等于 $x$。那么每隔 $x$ 个就设置一个点,表示无论如何都不能放 $1$ 在这上面。
然后一直选不在这些点且灯是关着的 $x$ 个点,直到大于等于 $R(n)$ 时结束就好了。
1 |
|