HDU 4726 Kia's Calculation

来源:互联网 发布:网络数据包分析 编辑:程序博客网 时间:2024/04/25 18:13

题目大意:  给定两个数位相等的数,可以改变各数位的位置(但不能有前导零),计算和值,注意算和时没有进位,问能得到的最大和值(不能有前导零)

分析:这题没有用到说明特殊知识,完全乱搞,但是需注意结果不能有前导零!  即下面这组数据:

1

100

900

答案是0     不是000


代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<vector>#include<cstdlib>#include<stack>#include<map>using namespace std;typedef long long LL;const int maxn=1000000+50;int a[30],b[30];char str1[maxn],str2[maxn];int main(){    int T,cas=1;    scanf("%d",&T);    while(T--)    {        printf("Case #%d: ",cas++);        scanf("%s%s",str1,str2);        int len=strlen(str1);        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        for(int i=0;i<len;i++)  a[str1[i]-'0']++;        for(int i=0;i<len;i++)  b[str2[i]-'0']++;        bool ok=false;        for(int i=9;i>=2;i--)        {            if(ok) break;            for(int u=i-1; u>0 ;u--)            {                if(a[u]&&b[i-u])                {                    ok=true;                    printf("%d",i);                    a[u]--;   b[i-u]--;                    break;                }                if(b[u]&&a[i-u])                {                    ok=true;                    printf("%d",i);                    b[u]--;   a[i-u]--;                    break;                }            }            for(int u=1;u<10;u++)            {                if(a[u]&&b[10+i-u])                {                    ok=true;                    printf("%d",i);                    a[u]--;  b[10+i-u]--;                    break;                }                else if(b[u]&&a[10+i-u])                {                    ok=true;                    printf("%d",i);                    b[u]--;  a[10+i-u]--;                    break;                }            }        }        if(!ok) //需注意这点        {                printf("0\n"); continue;        }        for(int l=1;l<len;l++)        {            ok=false;            for(int i=9;i>=0;i--)            {                if(ok) break;                for(int u=i; u>=0 ;u--)                {                    if(a[u]&&b[i-u])                    {                        ok=true;                        printf("%d",i);                        a[u]--;   b[i-u]--;                        break;                    }                    if(b[u]&&a[i-u])                    {                        ok=true;                        printf("%d",i);                        b[u]--;   a[i-u]--;                        break;                    }                }                for(int u=0;u<10;u++)                {                    if(a[u]&&b[10+i-u])                    {                        ok=true;                        printf("%d",i);                        a[u]--;  b[10+i-u]--;                        break;                    }                    else if(b[u]&&a[10+i-u])                    {                        ok=true;                        printf("%d",i);                        b[u]--;  a[10+i-u]--;                        break;                    }                }            }        }        printf("\n");    }    return 0;}