zoukankan      html  css  js  c++  java
  • 洛谷 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
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    vijos 1426
    2455 繁忙的都市
    2104 删除物品
    3235 战争
    BZOJ 2962
    COGS 265 线段覆盖
    P2184 贪婪大陆
    0729模拟赛解题报告
    BZOJ 1012
    BZOJ 2763
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819344.html
Copyright © 2011-2022 走看看