HDU 4726 Kia's Calculation

来源:互联网 发布:软件开发控制流程图 编辑:程序博客网 时间:2024/04/19 23:53

2013年成都邀请赛K题

将每个数字出现的次数计入数组 

然后从9到0寻找可以组合的次数

注意首位的处理和前导零

#include<bits/stdc++.h>using namespace std;int A[20],B[20],C[20];char s1[1000020],s2[1000020];int main(){    int T;    scanf("%d",&T);    for(int kase=1;kase<=T;kase++)    {        memset(A,0,sizeof(A));        memset(B,0,sizeof(B));        memset(C,0,sizeof(C));        scanf("%s%s",s1,s2);        int len=strlen(s1);        for(int i=0;i<len;i++)            A[s1[i]-'0']++;        for(int i=0;i<len;i++)            B[s2[i]-'0']++;        int flag=0,ans=0;        for(int i=9;i>=0;i--)        {            for(int j=9;j>=0;j--)            {                if(j!=0&&i!=j&&A[j]!=0&&B[(i-j+10)%10]!=0)                {                    ans=i;                    A[j]--;                    B[(i-j+10)%10]--;                    flag=1;                    break;                }            }            if(flag==1)                break;        }        for(int i=9;i>=0;i--)        {            for(int j=9;j>=0;j--)            {                if(A[j]!=0&&B[(i-j+10)%10]!=0)                {                    int minn=min(A[j],B[(i-j+10)%10]);                    C[i]+=minn;                    A[j]-=minn;                    B[(i-j+10)%10]-=minn;                }            }        }        int zero=0;        printf("Case #%d: ",kase);        if(ans!=0)        {            printf("%d",ans);            zero=1;        }        for(int i=9;i>=1;i--)        {            if(C[i]!=0)            {                zero=1;                break;            }        }        if(zero==1)        {            for(int i=9;i>=0;i--)            {                for(int j=1;j<=C[i];j++)                    printf("%d",i);            }        }        else            printf("0");        printf("\n");    }    return 0;}


0 0