1个空瓶只能喝到一瓶,2个空瓶能够喝到3瓶,3个空瓶能够喝到4瓶。
显然2是最佳状态,比起3换1,3/2>4/3。所以我们可以将购买瓶数优先拆分成2瓶的。
购买瓶数 拆分 拆分原则喝到的瓶数 按照3换1原则喝到的瓶数
10 5*2 5*3 = 10+3+1+1
11 5*2+1 5*3+1 = 11+3+1+1
12 6*2 6*3 = 12+4+1+1
25 12*2+1 12*3+1 = 25+8+3+1
可以发现其实拆分原则和3换1原则是一样。
我们假设购买的瓶数为buy,喝到的总数为get.
如果buy为偶数,拆分成2*n,get=buy*1.5 如果是奇数,拆分为2*n +1 , get=(buy-1)*1.5+1。
以下是题目1的实现
#include <iostream.h>
int main(int argc, char *argv[])
{
int buy;//表示买了多少瓶
cin>> buy;
cout<<"能够喝到的瓶数:"<<buy/2*3+buy%2;
}
题目2分析:
如果buy是偶数,即达到最佳状态,get一定是3的倍数。
所以我们可以根据get(喝到的瓶数)判断至少需要卖多少瓶。
如果get%3==0,至少需要get/3*2 ;get%2==1时,至少需要get/3*2+1瓶;get%2==2时,至少需要get/3*2+2瓶。
代码如下:
#include <iostream.h>
int main(int argc, char *argv[])
{
int get;
cin>>get;
cout<<"至少需要买的瓶数:"<<get/3*2+get%3;
}