题目大意:给出两个数,可以随意变换两个数种数字的位置,两数相加不进位,求得到的最大数十多少。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4726。
大体思路:一开始没看清楚数的大小,以为最大只有10^6,然后两wa,看清之后是数的位数不超过10^6。之后想了很久,没想出来。补题的时候看了别人的博客后恍然大悟,原来还可以这样。用两个数组a和b分别存储两个数中0到9的个数,然后答案每一位 i 从9到0枚举,这样可以保证得到的数最大。
#include<iostream>
#include<sstream>
#include<malloc.h>
#include<map>
#include<list>
#include<bitset>
#include<cctype>
#include<iomanip>
#include<utility>
#include<stdlib.h>
#include<functional>
#include<stdio.h>
#include<stack>
#include<queue>
#include<deque>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<set>
#include<vector>
using namespace std;
const int maxn=1e6+5;
char num1[maxn],num2[maxn],ans[maxn];
int a[10],b[10];
int main(){
int t;
scanf("%d",&t);
for(int Case=1;Case<=t;Case++){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s%s",num1,num2);
int len=strlen(num1);
if(len==1){
printf("Case #%d: %d\n",Case,(num1[0]+num2[0]-2*'0')%10);
continue;
}
for(int i=0;i<len;i++){
a[num1[i]-'0']++;
b[num2[i]-'0']++;
}
for(int i=0;i<len;i++){ //答案的每一位
bool flag=false;
for(int j=9;j>=0&&!flag;j--){ //对答案的每一位从9到0枚举
for(int k=0;k<=9;k++){ //从0到9查看数组a是否有值,k是数组a
if(j-k>=0){ //j-k是数组b,这里需要分情况
if(!(i==0&&(k==0||j-k==0)))
if(a[k]>0&&b[j-k]>0){
a[k]--;
b[j-k]--;
flag=true;
ans[i]=j+'0';
break;
}
}
else{
if(!(i==0&&k==0))
if(a[k]>0&&b[j+10-k]>0){
a[k]--;
b[j+10-k]--;
flag=true;
ans[i]=j+'0';
break;
}
}
}
}
}
ans[len]='\0';
if(ans[0]=='0'){
printf("Case #%d: 0",Case);
continue;
}
printf("Case #%d: %s\n",Case,ans);
}
return 0;
}