洛谷 P1582 倒水(思维+二进制)

 

题目链接:https://www.luogu.org/problemnew/show/P1582

       因为需要两两合并,所以瓶子里的水的值只能有2^n,所以可以联想到二进制,然后我们可以推几个数,发现最后所得的瓶子数就等于n的二进制数的1的个数,所以我们可以一个一个加n的值,然后判断是不是小于k的就行了(有的人说会T,我是100AC了),然而这种方法略显暴力了点,所以我们可以再想一下,对于一个数的二进制数,我们在它的二进制数的最低位的1加上1的话,所得的数的二进制的1的个数是不会增加的,比如101+1=110,但是如果是110+1=111这样就相当于多了1,所以我们可以利用这一点来对code来进一步优化,用lowbit函数找到最低位的1的位置,再更新n的值就好了,code中的__builtin_popcount()函数是用来求当前数的二进制数中的1的个数的,详细的可以看这篇博客:__builtin_函数


AC代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n,k;
	cin>>n>>k;
	int num = 0;
	while(__builtin_popcount(n) > k){
		num++;
		n++;
	}
	cout<<num<<endl;
	return 0;
}

AC代码(lowbit优化):

#include <bits/stdc++.h>
using namespace std;

int lowbit(int x){return x & (-x);}

int main()
{
	int n,k;
	cin>>n>>k;
	int num = 0;
	while(__builtin_popcount(n) > k){
		num += lowbit(n);
		n += lowbit(n);
	}
	cout<<num<<endl;
	return 0;
}

 

全部评论

相关推荐

Manayakko:实习和hw履历足够了,如果这还不行,那纯是吃了大环境经济发展问题的亏了
大家都开始春招面试了吗
点赞 评论 收藏
分享
白火同学:先说结论,对于一份实习简历来说,整体还是挺不错的,技术深度和广度都到位,找到一份中小厂的实习没啥问题。 再说说能优化的点吧。 1、量化结果,项目中很多工作量化一下结果给面试官的感受会更直观一些,也能体现你对应用该项技术的理解(在众多技术为什么要用它,运行性能或者说开发效率往往是一大考虑指标;而不是说大家做这种功能都用它,所以我用它)。 2、突出亮点,项目中可以从“工作职责”择一些“个人亮点”另写一块,优先去写开发过程中遇到的xx问题,使用xx技术达到xx效果,针对性去写一些疑杂难的功能,能带出你个人思考和解决的过程。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务