总结:题很简单,但是要考虑周全(尤其是对于INF的情况)
题意:给定x,y,a,b 表示用x个空瓶子能换一个新的可乐(即包含瓶盖和瓶身),用y个瓶盖能换取一个新可乐,现在你有a个空瓶子以及b个瓶盖,问最多能换取多少瓶可乐(如果能换取无限瓶可乐则输出INF)
思路:题意很简单 我们可以很快得到 a/x+b/y!=0的情况下 还能继续换可乐 ,同时下一次a,b的个数就要加上新换来的可乐个数 a = a%x+ a/x+b/y ; b = b%y+a/x+b/y ;
然后关键在INF的判断上。 要使换来的可乐无限 , 即: 永远 a/x+b/y >0 ,而下一次的 a2/x+b2/x = (a1%x+ a1/x+b1/y) / x + (b1%y+a1/x+b1/y) /y > 0 所以这样可以求解出(道理是这样推但是并不会解)
所以再换种思路想想,由于(0<a,b<=100) 所以定义一个阈值,超过我们就判他INF, 所以就做题而言(考虑第二种思路更有可能完成该题)
完整代码:(这个是有结论的,判断INF条件(但是很多题解上面并没有说怎么推导的))
#include <iostream> #define LL long long using namespace std; int main(){ int n; cin>>n; while(n--){ int x,y,a,b; cin>>x>>y>>a>>b; if((x==1||y==1)||((x==2&&y==2)&&(a>=x||b>=y))) cout<<"INF"<<endl; else{ int tmp; long int cnt = 0; while(a/x+b/y){ tmp =a/x+b/y; a = a%x+tmp; b = b%y+tmp; cnt += tmp; } cout<<cnt<<endl; } } }
代码2:
#include <iostream> #define LL long long const int inf = 1e3; using namespace std; int main(){ int n; cin>>n; while(n--){ int x,y,a,b; cin>>x>>y>>a>>b; int tmp,flag = 0; long int cnt = 0; while(a/x+b/y){ tmp =a/x+b/y; a = a%x+tmp; b = b%y+tmp; cnt += tmp; if (cnt>=inf) { flag = 1; cout<<"INF"<<endl; break; } } if(!flag) cout<<cnt<<endl; } return 0; }