HDU4726

来源:互联网 发布:笑笑淘宝店 编辑:程序博客网 时间:2024/06/06 00:39

思路:

1.用大小为10的数组保存a b的每位数字个数

2.先构造出第一位,再构造出其他位.因为第一位不能为0,所以要判断当前能够成的最大的数字 其中之一不能够是0

3.存在a=11 b=99之类的情况,和是00 多个0 ,转化成一个0


/*Code By Aquariuslt*//*HDU 4726 Kia's Calculation*/#include<iostream>#include<stdio.h>#include<string>#include<algorithm>#include<string.h>#include<set>#include<vector>#include<queue>#include<stack>#include<limits.h>#include<math.h>#define FOR(i,a,b) for(int i=(a);i<(b);i++)#define FORD(i,a,b) for(int i=(a);i<=(b);i++)#define REP(i,b) FOR(i,0,b)#define CLR(a) memset(a,0,sizeof(a))using namespace std;#define maxn 1000050char a[maxn],b[maxn];int sa[10],sb[10];char op[maxn];int main() {    int t;    scanf("%d",&t);    REP(ti,t) {        scanf("%s",a);        scanf("%s",b);        CLR(sa);        CLR(sb);        int lena=strlen(a),lenb=strlen(b);        REP(i,lena) {            sa[a[i]-'0']++;        }        REP(i,lenb) {            sb[b[i]-'0']++;        }        /*makefirst*/        int flag=0;        for(int sum=9; sum>=1; sum--) {            if(flag==1)break;            REP(i,10) {                if(flag==1)break;                REP(j,10) {                    if(flag==1)break;                    if(sa[i]>0&&sb[j]>0&&(i+j)%10==sum&&i!=0&&j!=0) {                        sa[i]--;                        sb[j]--;                        flag=1;                        op[0]='0'+(i+j)%10;                    }                }            }        }        if(flag==0)printf("Case #%d: 0\n",ti+1);        /*make other*/        else {            int opnow=1;            for(int sum=9; sum>=0; sum--) {                REP(i,10) {                    REP(j,10) {                        while(sa[i]>0&&sb[j]>0&&(i+j)%10==sum) {                            sa[i]--;                            sb[j]--;                            op[opnow++]='0'+(i+j)%10;                            //printf("%d %d\n",i,j);                        }                    }                }            }            /*make other solution 2*/            /*while(opnow<lena){                int maxnow=0;                int maxi,maxj;                REP(i,10){                    REP(j,10){                        if((i+j)%10>=maxnow&&sa[i]>0&&sb[j]>0){                            maxi=i;                            maxj=j;                            maxnow=(i+j)%10;                        }                    }                }                op[opnow++]='0'+maxnow;                sa[maxi]--;                sb[maxj]--;            }*/            op[opnow]='\0';            printf("Case #%d: %s\n",ti+1,op);        }    }    return 0;}


原创粉丝点击