Doctor Ghee is teaching Kia how to calculate the sum of two integers. But Kia is so careless and alway forget to carry a number when the sum of two digits exceeds 9 9. For example, when she calculates 4567+5789 4567+5789, she will get 9246 9246, and for 1234+9876 1234+9876, she will get 0 0. Ghee is angry about this, and makes a hard problem for her to solve:
Now Kia has two integers A A and B B, she can shuffle the digits in each number as she like, but leading zeros are not allowed. That is to say, for A=11024 A=11024, she can rearrange the number as 10124 10124, or 41102 41102, or many other, but 02411 02411 is not allowed.
After she shuffles
A
A and
B
B, she will add them together, in her own way. And what will be the maximum possible sum of
A
A +
B
B?
The first line has a number T T ( T≤25 T≤25) , indicating the number of test cases.
For each test case there are two lines. First line has the number A A, and the second line has the number B B.
Both A A and B B will have same number of digits, which is no larger than 106 106, and without leading zeros.
For test case
X
X, output Case #X:
first, then output the maximum possible sum without leading zeros.
1
5958
3036
Case #1: 8984
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N=2000010;
int num1[N],num2[N];
int sum[N];
int a[20],b[20];
string s,s1;
int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>s>>s1;
int l=s.length();
for(int j=0;j<l;j++)
{
num1[j]=s[j]-'0';
num2[j]=s1[j]-'0';
}
if(l==1)
{
printf("Case #%d: %d\n",i,(num1[0]+num2[0])%10);
continue;
}
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int j=0;j<l;j++)
{
a[num1[j]]++;
b[num2[j]]++;
}
int x=0,y=0;
int tt=-1;
for(int j=1;j<=9;j++)//最高位
for(int k=1;k<=9;k++)
if(a[j]&&b[k]&&((j+k)%10)>tt)
{
x=j;y=k;tt=(x+y)%10;
}
a[x]--;b[y]--;
int cnt=0;
sum[cnt++]=(x+y)%10;
for(int j=9;j>=0;j--)//下
for(int k=0;k<=9;k++)//上
{
if(a[k])
{
if(k<=j)//先找大的从9开始
{
int flag=j-k;
int sign=min(a[k],b[flag]);//计数最少的选
a[k]-=sign;
b[flag]-=sign;
while(sign--)
sum[cnt++]=j;
}
int flag=10+j-k;
if(flag>9) continue;
//j<k时的结果
int sign=min(a[k],b[flag]);
a[k]-=sign;
b[flag]-=sign;
while(sign--)
sum[cnt++]=j;
}
}
printf("Case #%d: ",i);
int ss=0;
while(ss<cnt-1&&sum[ss]==0) ss++;//剔除最高位为0;例如000时
for(int j=ss;j<cnt;j++)
printf("%d",sum[j]);
cout<<endl;
}
return 0;
}