题意:汽水瓶有三个部分cap+plastic bottle+ label(瓶盖-瓶身-瓶底),给出数据:n为原瓶数,x,y,z为这三个部分可以用相应的数字换取新瓶子,求最大总瓶数。
模拟(暴力)
1 //汽水瓶有三个部分-cap+plastic bottle+ label 2 //n为原瓶数 3 //x,y,z为这三个部分可以用相应的数字换取新瓶子,求最大总瓶数 4 #include<iostream> 5 #include<cstring> 6 #include<cstdio> 7 #include<algorithm> 8 using namespace std; 9 10 int t[3]; //当前三部分数量(按换瓶基数-调整顺序) 11 int c[3]; //三部分换瓶基数 12 13 int main() 14 { 15 int T,n; 16 scanf("%d",&T); 17 18 while(T--) 19 { 20 int b = 0; 21 scanf("%d%d%d%d",&n,&c[0],&c[1],&c[2]); 22 b = t[0] = t[1] = t[2] = n; 23 24 sort(c,c+3); //排序(偷懒啦= =) 25 26 int res; //可换瓶数量 27 while(t[0]/c[0] || t[1]/c[1] || t[2]/c[2]) 28 { 29 if(t[0]/c[0]) 30 { 31 b += res = t[0]/c[0]; 32 t[0] = t[0]%c[0]+res; 33 t[1] += res; 34 t[2] += res; 35 } 36 if(t[1]/c[1]) 37 { 38 b += res = t[1]/c[1]; 39 t[1] = t[1]%c[1]+res; 40 t[2] += res; 41 t[0] += res; 42 } 43 if(t[2]/c[2]) 44 { 45 b += res = t[2]/c[2]; 46 t[2] = t[2]%c[2]+res; 47 t[1] += res; 48 t[0] += res; 49 } 50 } 51 printf("%d ",b); 52 } 53 54 return 0; 55 }