2013 ACM/ICPC Asia Regional Online —— Warmup2 K、Kia's Calculation

1、我刚开始以为数字最大是10的6次方,没想到其实是数字的个数。

2、首先统计每个数字出现的个数,对于第一个数,要特判,A和B中不能有任何一个为0.

3、后面的就随意了,注意,可能所有数字都是0,这时不能输出前导零,只要用一个判断flag的语句即可实现。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char A[1000010],B[1000010];
int num1[10],num2[10];
int main(){
    int T;
 scanf("%d",&T);
 for(int kase=1;kase<=T;kase++){
         scanf("%s%s",A,B);
         printf("Case #%d: ",kase);
   memset(num1,0,sizeof(num1));
   memset(num2,0,sizeof(num2));
   int len=strlen(A);
   for(int i=0;i<len;i++){
    num1[A[i]-'0']++;
    num2[B[i]-'0']++;
   }
   bool flag=false;
   for(int M=9;M>=1;M--){
          for(int i=1;i<=9;i++){
              if(num1[i]>0){
     int temp1=M-i;
     if(temp1>0&&temp1<=9&&num2[temp1]>0){
      printf("%c",M+'0');
      num1[i]--;num2[temp1]--;
                  flag=true;
        }
     if(flag) break;
     int temp2=10+M-i;
     if(temp2>0&&temp2<=9&&num2[temp2]>0){
      printf("%c",M+'0');
      num1[i]--;num2[temp2]--;
      flag=true;
        }
     if(flag) break;
    }
        }
    if(flag) break;
     }
         if(!flag) {printf("0\n");continue;}
   for(int M=9;M>=0;M--){
          for(int i=0;i<=9;i++){
              if(num1[i]>0){
     int temp1=M-i;
     if(temp1>=0 && temp1<=9 && num2[temp1]>0){
      int m=min(num1[i],num2[temp1]);
      num1[i]-=m;num2[temp1]-=m;
      for(int k=0;k<m;k++)
       printf("%c",'0'+M);
        }
     int temp2=10+M-i;
     if(temp2>=0 && temp2<=9 && num2[temp2]>0){
      int m=min(num1[i],num2[temp2]);
      num1[i]-=m;num2[temp2]-=m;
      for(int k=0;k<m;k++)
       printf("%c",'0'+M);
        }
    }
        }
      }
   printf("\n");
 }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值