P1582 倒水(思维)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugarbliss/article/details/85170104

题目链接:https://www.luogu.org/problemnew/show/P1582

思路:首先如果一个数等于2的n次方,那么合并后一定是1个瓶子。而2的n次方中1的个数也是1个,13的二进制1 1 0 1,二进制1的个数3个,刚好13合并后是3个瓶子。我们可以得到一个数二进制1的个数就是这个数合并后的瓶子个数。我们在学树状数组时有一个lowbit函数(x & -x),就是取最后一位1的值(注意是数值),举个栗子:13二进制 1 1 0 1  lowbit(13) = 1,12二进制 1 1 0 0, lowbit(12) = 4。一开始n个瓶子,当合并后瓶子不够时我们就可以添加 lowbit(n) 个瓶子,因为添加lowbit(n) 个瓶子原来的二进制数刚好可以进位(也就是可以合并两个瓶子),当二进制1的个数小于等于k时就可以了。

#include <bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
int solve(int x)
{
    int cnt = 0;
    while(x)
    {
        x -= x & -x;
        cnt++;
    }
    return cnt;
}
int main()
{
    int n, k, ans = 0;
    read(n); read(k);
    while(solve(n) > k)
    {
        ans += n & -n;
        n += n & -n;
    }
    cout << ans << endl;
}

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/85170104