2013寒假练习 1003: Exchange for Cola(2/13更新)

地址:http://acm.bit.edu.cn/mod/programming/view.php?a=489

数论水题。题意是集瓶盖换汽水,a个瓶盖换b瓶汽水,然后一开始有n个瓶盖,允许借瓶盖。

一开始的思路是认为借瓶盖只要最终能还上就行,那么每个瓶盖的“价值”都能被完全利用,经过一番推导得出N*B/(A-B)取整 (无穷等比数列)结果过不了样例=w=。。

然后发现好像借必须换一次就要还,故直接模拟水过。总之还是很坑爹的题。1Y。

#include<iostream>
using namespace std;
int main()
{
	int n,a,b,cap,sum;
	while(scanf("%d%d%d",&n,&a,&b)!=EOF)
	{
		for(sum=0,cap=n;;)
		{
			if(cap>=a)              //若足够a个
			{
				sum+=cap/a*b;
				cap=cap%a+cap/a*b;
			}
			else if(a-cap<=b)       //若不够a个但借了能还上
			{
				sum+=b;
				cap=b-(a-cap);
			}
			else break;             //若借了也不够
		}
		printf("%d\n",sum);	
	}	
	return 0;
}


2/13:发现其实答案等于n/(a-b)*b..因为a换b允许借完全等同于用a-b个瓶盖喝b瓶汽水且不能借!(瓶盖已经提前还掉了)故一共可以换n/(a-b)次,喝到n/(a-b)*b瓶汽水

于是以下是简单版代码:

#include<iostream>
int n,a,b;
int main()
{
 while(~scanf("%d%d%d",&n,&a,&b)) printf("%d\n",n/(a-b)*b);
}

谁说是水题的~!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值