ccf试题1:打酱油

ccf试题1:打酱油

题目

问题描述
      小明带着N元钱去买酱油。酱油10块钱一瓶,商家进行促销,每买3瓶送一瓶,或者每买5瓶送2瓶。请问小明最多可以得到多少瓶酱油。
输入格式
      输入的第一行包含一个整数N,表示小明可用于买酱油的钱数。N是10的整数倍,N不超过300。
输出格式
      输出一个整数,表示小明最多可以得到多少瓶酱油。
样例1
输入:

40

输出:

5

说明:
      把40元分成30元和10元,分别买3瓶和1瓶,其中3瓶送一瓶,共得到5瓶。
样例2
输入:

80

输出:

11

说明:
      把80元分成30元和50元,分别买3瓶和5瓶,其中3瓶送1瓶,5瓶送2瓶,共得到11瓶。

分析

      目标是用N元钱买到最多的酱油,那么如何买才能获得最多的酱油呢?一种看似正确的方法是贪心算法,即先买50元的,每瓶酱油的单价约为7.1元,不够买50元的后 再买30元的,每瓶酱油的单价为7.5元,不够买30元的后 再买10元的,每瓶酱油的单价为10元。先说一句:解这个题目使用贪心算法是正确的,后面是我写的一些不严谨的证明其正确的想法,可越过下面文字直接看代码。
      首先为什么贪心算法可能会有错误?考虑当N=70,此时1个50元、2个10元,可买9瓶酱油,也可以看作2个30元,1个10元,同样可以买9瓶酱油;再考虑N=90时,此时1个50元、1个30元、1个10元、可买12瓶酱油,也可以看作3个30元,同样可买12瓶酱油。那么如何证明贪心算法得到的结果肯定是正确的呢,一种严谨且正确的方法是列举法,因为N是10的整数倍,N不超过300,我们可直接列出所有情况,证明此方法正确。
      另一种方法是,考虑用不同于贪心算法的方法购买和贪心算法相同数量的酱油,但花钱更少这种情况,如果存在这种情况,且当少花的钱数大于10时,那就证明了贪心算法错误。考虑只用30元买的情况:设买了M瓶,M = x+y+z,考虑(50/7)x + (30/4)y + 10z > (30/4)(x+y+z)是否成立,整理后得7z > x,然后我就不知道怎么做了。…额。。。我个渣渣。。。

代码

#include <iostream>
using namespace std;

int main(){
	int money;
	cin >>money;
	int total;
	int five_num;
	int three_num;
	int one_num;
	
	five_num = money / 50;
	three_num = (money % 50) / 30;
	one_num = (money - five_num*50 - three_num*30) / 10;
	
	total = five_num * 7 + three_num * 4 + one_num;
	cout <<total<<endl;
	
	return 0;
} 

总结

      代码越短越nb。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值