题目如下:
啤酒2块一瓶,4个瓶盖可换1瓶,2个空瓶可换1瓶,不可借钱、借空瓶或借瓶盖,n块钱可以喝多少瓶?
输入格式:
输入购买啤酒的金额n,n为正整数
输出格式:
输出可以喝到的啤酒瓶数
输入样例:
10
输出样例:
15
时间限制:500ms内存限制:32000kb
这题应该是很经典的一题了,作为初学者,想了好久,才想出一种解法
如下:
#include<iostream>
using namespace std;
int main()
{
int n,a=0,b=0,sum=0;
cin>>n;
sum=n/2;
a=sum;
b=sum;
while(a>=2||b>=4)
{
int c=0;
c+=a/2;
a=a%2;
c+=b/4;
b=b%4;
a+=c;
b+=c;
sum+=c;
}
cout<<sum;
}
这应该是很常见的一种解法
但,这不是今天的重点,同时也不是我首先考虑的方向
看到这一题,对于我来说,逻辑已经够复杂了,因此,我首先想的是从数学角度入手
我先举了几个例子:
4元,3瓶
6元,7瓶
8元,11瓶
10元,15瓶
12元,19瓶
…………
相信到这,一些对数据敏感的读者已经发现了,瓶数随钱成等差数列递增
因此,我大胆猜测,写了如下代码:
#include<iostream>
using namespace std;
int main()
{
int n,a;
cin>>n;
a=n/2;
if(a==0)
cout<<0;
else if(a==1)
cout<<1;
else
cout<<(4*a-5);
return 0;
}
一检测,也通过了!
虽然代码看着短,但是,所耗时间一点都不短,足足用了好几张草稿纸才推测出来
不过,现在有个问题,我只能知道这个结论是对的,但,我并不能完整的把它严格的证明出来(数学水平有限),因此,希望大佬能帮我证明一下,多谢!!!