地址: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);
}
谁说是水题的~!