题解:CF437B The Child and Set

一道贪心题。

先说结论,把 mm 以内的数列出来,算出 lowbit\operatorname{lowbit} 值,从大到小排序(后文称该数组为 ff 数组),遍历每一个 fif_i,若 nfin\ge f_i,则 nn 减去 fif_ifif_i 即为答案里的一个数,若到最后 n>0n>0,则无解。

贪心需要证明,证明如下:

对于每一个数,它可以用 2x(x不重复)2^x\text{(x不重复)} 的和来表示

这个又怎么证明呢?

显然,每个数都可以用二进制表示,如 1010 可用 1010(2)1010_{(2)} 表示,也等于 0×20+1×21+0×22+1×230\times2^0+1\times2^1+0\times2^2+1\times2^3,化简为 21+232^1+2^3,证毕。

lowbit\operatorname{lowbit} 值一定是 22 的整次幂,是因为它是二进制中某一位的值,所以若干个 lowbit\operatorname{lowbit} 值,一定可以组成 nn


主要代码:

int lowbit(int x){
    return (x & (-x));
}
bool cmp(int x, int y){
    return lowbit(x) > lowbit(y);
}
for(int i = 1; i <= m; i ++) a[i] = i;
sort(a + 1, a + m + 1, cmp);

posted on 2024-07-04 13:01  zhangzirui66  阅读(8)  评论(0)    收藏  举报  来源

导航