bzoj1192: [HNOI2006]鬼谷子的钱袋

    xiaoxiao2021-03-25  45

    链接

      http://www.lydsy.com/JudgeOnline/problem.php?id=1192

    题解

    这个不是傻逼题吗

      显然直接二进制拆。现在要处理重复的问题。   比如5,直接拆出来是1+2+2,因为有两个2,所以不合法。但是正确的答案肯定是5=1+1+3,这样1、2、3、4、5都能够组合出来。   具体的,如果两个二进制数 10000 10000 ,我把它们变成 1111 10001 ,如果原来的方案里要用 10000+10000 ,那现在可以直接用拆出来的两个新的替代。   如果原来只用其中一个,那么现在可以用 1111+1 。如果原来就要用 10000+1 ,那现在就可以用 10001 。   这题也不是特别傻逼,竟然难住了明神。

    代码

    //傻逼题 #include <cstdio> #include <algorithm> #define ll long long using namespace std; int main() { ll m, x, cnt=0; scanf("%lld",&m); for(x=1;x<=m;x=x<<1)cnt++,m-=x; if(m)cnt++; printf("%lld",cnt); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-36312.html

    最新回复(0)