当前位置: 代码迷 >> 综合 >> 洛谷 P1582 倒水 (二进制)
  详细解决方案

洛谷 P1582 倒水 (二进制)

热度:32   发布时间:2023-09-20 18:40:56.0

这道题实际上是考二进制

很容易看出杯子水量一定是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;
}

 

  相关解决方案