【luoguP1582】

二进制题???

我们发现(谁知道咋发现的……)你有a个瓶子 那么你最多能合成num个瓶子 num=a转化成二进制的1的个数

你想要b个瓶子 如果num<=b 你可以自力更生艰苦创业不需要别的瓶子 

 如果num>b 你需要在a的二进制中消1

你不知道的事:

       i&-i是指从后往前数,到第一个1出现为止的数(二进制下)

       int work(int x){int num=0;for(;x;x-=x&-x) num++;return num;}这是算二进制中1的个数

       ans+=n&-n;n+=n&-n;  比如11100010101010101000 第一次要加1000把1000变成10000 所以瓶+=1000(这个地方理解为十进制 但是反正计算机就是二进制加减)原来的数也+=1000!

#include<iostream>
#include<cstdio>
using namespace std;
int n,k,ans;
int work1(int x){
    int num=0;
	for(;x;x-=x&-x) num++;
	return num;
}
int main() {
	ios::sync_with_stdio(false);
	cin>>n>>k;
	while(work1(n)>k) {
		ans+=n&-n;
		n+=n&-n;
	}
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/syh8501/article/details/88963680