原题链接:饮料换购
解法1:
暴力模拟
设瓶盖数量为 m m m,当 m > = 3 m>=3 m>=3时一直循环模拟换购,每次循环表示用当前剩余的瓶盖换购,再将换购后的饮料喝完。至此循环一轮。
每一轮可以换购 m / 3 m/3 m/3瓶,还剩下 m m o d 3 m mod 3 mmod3 个瓶盖,就会多出来 m / 3 m/3 m/3个瓶盖。
代码:
//暴力模拟:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;//n等于瓶子数
int ans=0;
cin>>n;
ans=n;
while(n>2)
{
ans+=n/3; //n此处为瓶盖数量
n=n%3+n/3;
}
cout<<ans;
return 0;
}
解法2:
找出规律:
设最后总共喝了x瓶饮料,则共有x-n瓶饮料是换购来的。
因为最后1个瓶盖无法换购,那么实际参与了换购的瓶盖只有 x − 1 x-1 x−1 个。
故可得: x − n = ( x − 1 ) / 3 x-n=(x-1)/3 x−n=(x−1)/3
所以: x = ( 3 ∗ n − 1 ) / 2 x=(3*n-1)/2 x=(3∗n−1)/2
代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;//n等于瓶子数
cin>>n;
cout<<(3*n-1)/2;
return 0;
}