中秋特辑--洛谷题目-P2431【正妹吃月饼】

中秋特辑—洛谷题目讲解

P2431 正妹吃月饼

又快到了一年一次的中秋节了,也不知道大家有没有去吃月饼,嘿嘿,我最喜欢云腿月饼老好吃了。
虽然是到了中秋节,但是我们依然要刷题来复习和提高自己欸。
现在Bugku都开始发月饼了,嘿嘿但是我们尽头主要是回归一下老本行,今天就进行一次算法题目讲解吧,正好我们可以复习复习一下以前的知识,那么我们就开始吧
今天我们讲解的是
在这里插入图片描述
众说周知,洛谷的难度都要往上提一个级别才是这个题目的真正难度。。。咳咳咳好了好了话不多说,我们就开始看题吧
在这里插入图片描述
好吧,我的第一感觉就是贪心,模拟。
让我康康我猜的对不对
在这里插入图片描述

欸,还有个进制?好吧,,等晚一些我再研究一下为啥会用到进制。
如果不看进制,我想到的第一个思路就是:
1.将所有的月饼克数按照从小到大的顺序相加,加到一个在a和b范围以内的值
2.找到这样一个值以后返回就可以了。
既然有思路我们就先试试看这样写能不能成

#include<iostream>
using namespace std;
int main(){
	int sum=1,a,b,ans=2,num=0;
	cin>>a>>b;
	while(sum<=b){
		sum+=ans;
		ans*=2;
		num++;
	}
	cout<<num;
	return 0;
} 

这就是最简单的思路了对吧,看上去也很简单,就是不断乘不断加再不断计数
对于num为啥从0开始其实是因为,虽然一开始我们sum已经是0了但是在最后一次while循环中我们会加上下一个我们不会去吃的月饼就会多一个,如果num从1开始算的话,我们最后输出的num就要减去最后我们没有吃的哪一个月饼,然后我们运行一下尝试一下
在这里插入图片描述
好像没啥大问题,那么我们先提交看一下
你看,已提交问题就出来了
在这里插入图片描述
其实出现问题是肯定的,毕竟一个简单的模拟不可能在洛谷达到普及+/提高的难度
那咋办啊,我们先找到原因,回到题目
在这里插入图片描述
发现问题了,这空间那么大,无法满足。
这个时候我们就想到刚才的进制了,莫非用二进制表示?
那么我们先想一下思路,说到二进制就想到了位运算
因为我们存在了第一个1g月饼的存在,也就是说明我们无论如何吃,要吃多少,都肯定是一个单数,那么单数在二进制如何表达呢,就是最低位肯定为1,并且我们可以从a开始到b中间,我们可以大胆的推测找一下1最多的二进制然后将1的个数统计出来也许就可以了。
好的理论存在,我们就可以开始实践一下了:
我们先进行一下分布实现:

while((a | a+1)<=b){
		a |= a+1;
	}

这一步主要是找到a和b之间1最多的二进制,下一步

while(a){
		ans +=a&1;
		a>>=1;
	}

统计最多1的二进制中a的个数,ans每统计一次a就右移一位也就是说111就会变成011移动一位之后最右边的1就不在了最左边用0代替也可以省略0
然后结合起来
【因为我对于二进制的了解不多,我运用到的是以前看到过的相似的一个题的写法】

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
	int ans=0,a,b;
	cin>>a>>b;
	while((a | a+1)<=b){
		a |= a+1;
	}
	while(a){
		ans +=a&1;
		a>>=1;
	}
	cout<<ans;
	return 0;
}

芜湖,然后我们尝试运行一下
在这里插入图片描述
结果还是一样的,那么我们再提交一下尝试一下
在这里插入图片描述
欸~~~~~为啥呀为啥呀。。。。
好吧,我们再理性分析一波,会不会是a和b的值我用Int装不下?
那么我们尝试一下long long
int a b;
改为 long long a b;
试一下,欸,好像没问题了欸
在这里插入图片描述
嘿嘿嘿,你学废了吗,这题其实是有一点难度的,主要是考大家对于二进制的熟悉和写法,还有我们要充分主要到二进制的特点,只有0和1我们就要运用到两个的个数。
不知道大家有啥其他的写法,大家可以一起分享和交流

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酱油牌酱油菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值