hdu 4920 Ugly Problem [模拟+大数减法]



点击打开链接



题意:

                 给你一个巨大无比的数字。

                让你拆成50个以内的回文数字。


题解:

               长度最长1000位。 

              成为回文很明显可以想到折半找, 如果 前半部分反转之后小于后半部分,直接可以构成一个回文,长度直接减半。

              现在问题是不符合上面情形怎么办,

              我的方法是构造一个最大的回文,构造方法是取每一位和他对称位的最小值,

             如:  88886789  构造出  88766788;

             然后做差,如果后半段是0的话直接减1.

             这两步加起来约等于折半效果。

            但是还有一个错误点,wa了好多发, 一度怀疑题目,,,,

            这种构造方法,的原数列末尾一定不能为0!!!!!



    #include
    #define ll long long

    using namespace std;
    const int maxn=1e4+10;
    string s;

    string sub(string a,string b)
    {
        string c;
        bool ok=0;
        int len1=a.length();
        int len2=b.length();
        int len=max(len1,len2);
        for(int i=len1;i=0;i--)
        {
            if(a[i]b[i]) return 1;
            if(a[i]>s;
            int ss=0;
            string s1,s2,s3,s5;
            while(1){
                //cout<=0;--i)
                    s3+=s1[i];
                int t=daxiao(s2,s3);
                if(t==1){
                    if(len&1) s1+=s[mid];
                    s1+=s3;
                    ans[++ss]=s1;
    //cout<<"s=="<=0;--i) s3+=s3[i];
                        else s3="1";
                    }
    //                cout<


你可能感兴趣的:(模拟)