浙大PAT甲级-1010

来源:互联网 发布:淘宝卖霉菌龟头炎药品 编辑:程序博客网 时间:2024/05/18 00:22

Radix

这道题能完全ac真的很难

我是参考这篇(http://blog.csdn.net/matrix_reloaded/article/details/35880933)慢慢调出来的,他说的注意概括的比较好,我不做赘述,就强调一点(不是二分搜索):3.算法剪枝(3)对应的函数就是cmp()。

这道题也让我认识到点改进算法的意义了。

#include <iostream>#include <cstring>#include <cmath>using namespace std;long long int ni;long long int num(string s,long long int radix){    int i, ls=s.length();    long long int a=0,b=1;    for(i=ls-1;i>=0;i--){        int x;        if(s[i]>='0'&&s[i]<='9')            x=s[i]-'0';        else if(s[i]>='a')            x=s[i]-'a'+10;        a+=x*b;        b*=radix;    }    return a;}int cmp(string s,long long int radix){    int i, ls=s.length();    long long int a=0,b=1;    for(i=ls-1;i>=0;i--){        int x;        if(s[i]>='0'&&s[i]<='9')            x=s[i]-'0';        else if(s[i]>='a')            x=s[i]-'a'+10;        a+=x*b;        if(a>ni)            return 1;        b*=radix;    }    if(a==ni)        return 0;    return -1;}int maxNum(string s){    char a=s[0];    int ls=s.length();    for(int i=1;i<ls;i++){        if(a<s[i])            a=s[i];    }    if(a>='0'&&a<='9')        return a-'0';    else if(a>='a')        return a-'a'+10;}int main(){    string a, b;    int tag;    long long int n1, n2, i,radix, radix2=0;    cin>>a>>b>>tag>>radix;    int maxnum;    bool judge=false;    if(a=="1"&&b=="1"){        cout<<2<<endl;        return 0;    }    if(a==b){        cout<<radix<<endl;        return 0;    }    if(tag==1){            n1=num(a,radix);            ni=n1;            maxnum=maxNum(b);            long long int f, l, m;            if(num(b,maxnum+1)<n1){                f=maxnum+1;                l=(maxnum+1)<n1?(n1):(maxnum+1);            while(f<=l){                m=(f+l)/2;                int res=cmp(b,m);                if(res==0){                    radix2=m;                    judge=true;                    break;                }                else if(res==1){                    l=m-1;                }else{                    f=m+1;                }            }            }else if(num(b,maxnum+1)==n1){                judge=true;                radix2=maxnum+1;            }    }else{            n2=num(b,radix);            ni=n2;            maxnum=maxNum(a);            long long int f, l, m;            if(num(a,maxnum+1)<n2){                f=maxnum+1;                l=(maxnum+1)<n2?(n2):(maxnum+1);            while(f<=l){                m=(f+l)/2;                int res=cmp(a,m);                if(res==0){                    radix2=m;                    judge=true;                    break;                }                else if(res==1){                    l=m-1;                }else{                    f=m+1;                }            }            }            else if(num(a,maxnum+1)==n2){                judge=true;                radix2=maxnum+1;            }    }    if(judge)        cout<<radix2<<endl;    else        cout<<"Impossible"<<endl;    return 0;}



原创粉丝点击