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

本文探讨了一道关于集瓶盖换汽水的数论题目,解析了两种解题思路:一是通过模拟的方式解决,二是简化计算公式。最终提供了一个简洁的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址: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);
}

谁说是水题的~!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值