版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}