HDU 4726 Kia's Calculation(贪心构造)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4726

题意:给出两个n位的数字,均无前缀0。重新排列两个数字中的各个数,重新排列后也无前缀0。得到的两个新数相加和最大。这里的相加是无进位的相加。输出结果。输出时不要输出前缀0。

思路:答案的第一位比较特殊,相加的两个数中不能有0.可以枚举这个答案中的第一个数字,查找是否存在两个数相加为这个数字。后面的道理一样,也是枚举。

 

int a[2][10];

int n;

char s[2][N];

int s1[N],s2[N],ans[N];



int main()

{

    int num=0;

    rush()

    {

        clr(a,0);

        int i,j,k;

        FOR0(i,2)

        {

            RD(s[i]);

            n=strlen(s[i]);

            FOR0(j,n) a[i][s[i][j]-'0']++;

        }

        int e=0,top=0,tail=0;

        for(i=9;i>=2;i--)

        {

            for(k=1,j=i-1;k<10;k++,j=(j+9)%10) if(j&&a[0][k]&&a[1][j])

            {

                ans[++e]=i;

                a[0][k]--;

                a[1][j]--;

                break;

            }

            if(k<10) break;

        }

        if(!e) ans[++e]=0,a[0][s[0][0]-'0']--,a[1][s[1][0]-'0']--;

        for(i=9;i>=0;i--)

        {

            k=i;

            for(j=0;j<10;j++)

            {

                while(a[0][j]&&a[1][k])

                {

                    ans[++e]=i;

                    a[0][j]--;

                    a[1][k]--;

                }

                k=(k+9)%10;

            }

        }

        printf("Case #%d: ",++num);

        for(i=1;i<n&&ans[i]==0;i++);

        for(j=i;j<n;j++)printf("%d",ans[j]);

        PR(ans[j]);

    }

}

  

你可能感兴趣的:(HDU)