luogu P1582 倒水

题解

一开始很容联想到二叉树的结构,初始的杯子数就是子节点,两个相邻子变父,这样不断往上走。
当然其实和树没有什么关系只是可以形象化理解。
容易知道任何 2^k个水杯都可以最后合成 1 个,那么我们只要不断地对现有的杯子求 <= 当前杯子数的
2^k,然后n减去2^k,这表示这么多的杯子可以合成一个,所以再 k–,如此往复直到 k==1,这时所剩
的杯子数目 n 就必须想能办法合成一个,如若不能那添加的数就是答案。


Code

// head files excluded
using namespace std;

int n,m;
int cot[33];
int main(){

    cin>>n>>m;
    int pd;
    pd=1;
    for(int i=0;i<32;i++){
        cot[i] = pd;
        pd*=2;
    }

    while(m!=1){
        pd = 0;
        while(cot[pd]<=n){
            pd++;
        }
        pd--;
        n-= cot[pd];
        m--;
    }
    if(n==0){
        cout<<0<<endl;
        return 0;
    }

    pd=0;
    while(cot[pd]<n) pd++;
    cout<<cot[pd]-n<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值