Kia's Calculation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 624 Accepted Submission(s): 178
Problem Description
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. For example, when she calculates 4567+5789, she will get 9246, and for 1234+9876, she will get 0. Ghee is angry about this, and makes a hard problem for her to solve: Now Kia has two integers A and 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, she can rearrange the number as 10124, or 41102, or many other, but 02411 is not allowed. After she shuffles A and B, she will add them together, in her own way. And what will be the maximum possible sum of A "+" B ?
Input
The rst line has a number T (T <= 25) , indicating the number of test cases. For each test case there are two lines. First line has the number A, and the second line has the number B. Both A and B will have same number of digits, which is no larger than 106, and without leading zeros.
Output
For test case X, output "Case #X: " first, then output the maximum possible sum without leading zeros.
Sample Input
1 5958 3036
Sample Output
Case #1: 8984
Source
代码:786ms 采用数组存储,来做的...比较惊险的,卡过去了!!
代码:
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #define maxn 1000000 //1e6 7 using namespace std; 8 char a[maxn+5],b[maxn+5],c[maxn+5]; 9 void cal(int *str,char *a,int len) 10 { 11 for(int i=0;i<len;i++) 12 { 13 str[a[i]-'0']++; 14 } 15 } 16 int main() 17 { 18 int t,i,j,count=1,max,posi,posj,len1,k; 19 //freopen("test.in","r",stdin); 20 //freopen("test.out","w",stdout); 21 scanf("%d",&t); 22 while(t--) 23 { 24 int A[10]={0},B[10]={0},flag=0; 25 memset(a,' ',sizeof a); 26 memset(b,' ',sizeof b); 27 memset(c,' ',sizeof c); 28 scanf("%s%s",a,b); 29 len1=strlen(a); 30 cal(A,a,len1); 31 cal(B,b,len1); 32 printf("Case #%d: ",count++); 33 for(k=1;k<=len1;k++) 34 { 35 max=-1; 36 for(i=9;i>=0;i--) 37 { 38 if(k==1&&i==0&&len1!=1) continue; 39 if(A[i]) 40 { 41 for(j=9;j>=0;j--) 42 { 43 if(k==1&&j==0&&len1!=1) continue; 44 if(B[j]) 45 { 46 int temp=(i+j)%10; 47 if(max<temp) 48 { 49 max=temp; 50 posi=i; 51 posj=j; 52 } 53 } 54 if(max==9)break; 55 } 56 } 57 if(max==9)break; 58 } 59 A[posi]--; 60 B[posj]--; 61 c[flag++]=max+'0'; 62 } 63 if(flag>1) 64 { 65 if(c[0]>'0') 66 printf("%c",c[0]); 67 for(i=1;i<flag;i++) 68 { 69 printf("%c",c[i]); 70 if(c[0]<='0'&&c[i]=='0') break; 71 } 72 puts(""); 73 } 74 else 75 printf("%c ",c[0]); 76 } 77 return 0; 78 }