题目链接: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]); } }