洛谷 P1582 倒水 (二进制)

这道题实际上是考二进制

很容易看出杯子水量一定是2的i次方

所以n杯水最后剩下的水一定是n用二进制表示中1的个数

所以就枚举n来求什么时候1的个数小于k

那么这里有个优化,不然会超时

因为每次加的目的是要让1的个数变少,也就是要进位
所以每次加上的是lowbit(n)

#include<cstdio>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;

int lowbit(int x) { return x & (-x); }
int num(int x) { return !x ? 0 : 1 + num(x & (x - 1)); }

int main()
{
	int n, k, ans = 0;
	scanf("%d%d", &n, &k);
	while(num(n) > k)
	{
		ans += lowbit(n);
		n += lowbit(n); 
	}
	printf("%d\n", ans);
	return 0;
}

 

posted @ 2018-09-20 18:52  Sugewud  阅读(151)  评论(0编辑  收藏  举报