ZOJ

总结:题很简单,但是要考虑周全(尤其是对于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;        
}
原文地址:https://www.cnblogs.com/Tianwell/p/11229802.html