23.11.14

题目:

image

解题思路1:

赊账前提:

​ 易知,对于赊的可乐数与手中空瓶数,以及瓶盖数要有如下关系:

​ **若赊账x瓶;

​ (手中空瓶数+x(空瓶数))/2 + (手中瓶盖数+x(瓶盖数))/4 >= x

​ 也就是说,必须做到赊账后能还给老板。**

数据分析:

​ 对于空瓶数:取0或者1

​ 对于瓶盖数:取0,1,2,3

​ 这时才满足借的条件,也就是自身不能在和老板换取了,只有通过赊账才有可能继续下去

​ 列出下面表格:

| 空瓶数 | 瓶盖数 | 赊账数(瓶) |

|0|0|无论借几瓶都无解|

|0|1|无论借几瓶都无解|

|0|2|要一次性借2瓶|

|0|3|借一瓶|

|1|0|借一瓶|

|1|1|借一瓶|

|1|2|借一瓶|

|1|3|借一瓶|

解题思路2:

当然这是一个数学题,可以用数学的思维去解答:

假设1瓶可乐1元钱,喝完瓶子当0.5元用,瓶盖可以当0.25元用,相当于你只花了0.25元喝一瓶可乐,换句话说就是1瓶可乐的钱可以喝4瓶,输入可乐的数量,直接输出4的倍数就行了

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include<iostream>
using namespace std;
int sum;
int n;
int m;
int s = 0;
void aaaa(int &n,int &m,int &sum){
if(n<2&&m<4){
// //不能换了,开始赊
if((n+1)/2+(m+1)/4>=s+1){
//可以赊
s++;
n++;
m++;
sum++;
cout<<"n:"<<n<<endl;
cout<<"m:"<<m<<endl;
cout<<"sum:"<<sum<<endl;
cout<<"s:"<<s<<endl;
aaaa(n,m,sum);
}else if((n+2)/2+(m+2)/4>=s+2){
//可以赊
s=s+2;
n=n+2;
m=m+2;
sum=sum+2;
cout<<"n:"<<n<<endl;
cout<<"m:"<<m<<endl;
cout<<"sum:"<<sum<<endl;
cout<<"s:"<<s<<endl;
aaaa(n,m,sum);
}else{
return ;
}
// return ;
}else{
int x = n/2;//空瓶能换多少
n=n%2;
int y = m/4;//瓶盖能换多少
m=m%4;
sum = sum+ x + y-s;//还给老板
if(x>=s){
x=x-s;
}else{
y=y-s;
}
n=n+x+y;
m=m+x+y;
s=0;
aaaa(n,m,sum);
}
}
int main(){
cout<<"输入已有可乐数:"<<endl;
cin>>sum;
n=sum;
m=sum;
aaaa(n,m,sum);
cout<<n<<endl;
cout<<m<<endl;
cout<<sum<<endl;
return 0;
}

运行结果:

image