题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4726
题意:给出两个n位的数字,均无前缀0。重新排列两个数字中的各个数,重新排列后也无前缀0。得到的两个新数相加和最大。这里的相加是无进位的相加。输出结果。输出时不要输出前缀0。
思路:答案的第一位比较特殊,相加的两个数中不能有0.可以枚举这个答案中的第一个数字,查找是否存在两个数相加为这个数字。后面的道理一样,也是枚举。
int a[2][10];
int n;
char s[2][N];
int s1[N],s2[N],ans[N];
int main()
{
int num=0;
rush()
{
clr(a,0);
int i,j,k;
FOR0(i,2)
{
RD(s[i]);
n=strlen(s[i]);
FOR0(j,n) a[i][s[i][j]-'0']++;
}
int e=0,top=0,tail=0;
for(i=9;i>=2;i--)
{
for(k=1,j=i-1;k<10;k++,j=(j+9)%10) if(j&&a[0][k]&&a[1][j])
{
ans[++e]=i;
a[0][k]--;
a[1][j]--;
break;
}
if(k<10) break;
}
if(!e) ans[++e]=0,a[0][s[0][0]-'0']--,a[1][s[1][0]-'0']--;
for(i=9;i>=0;i--)
{
k=i;
for(j=0;j<10;j++)
{
while(a[0][j]&&a[1][k])
{
ans[++e]=i;
a[0][j]--;
a[1][k]--;
}
k=(k+9)%10;
}
}
printf("Case #%d: ",++num);
for(i=1;i<n&&ans[i]==0;i++);
for(j=i;j<n;j++)printf("%d",ans[j]);
PR(ans[j]);
}
}