HDU 4726

Kia's Calculation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 537    Accepted Submission(s): 149


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
 

  没什么好说的吧,觉得思路要清醒点。

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <fstream>
#include <vector>
#define Min(a,b) ((a)<(b)?(a):(b))
#pragma comment(linker, "/STACK:16777216")
using namespace std ;
typedef __int64 LL ;
const int size=1000008 ;
struct Node{
     int  X ;
     int  Y ;
     Node(){} ;
     Node(int x ,int y):X(x),Y(y){} ;
};
vector<Node>vec[10] ;
void init(){
   for(int i=0;i<=9;i++)
      for(int j=i;j<=9;j++){
         vec[(i+j)%10].push_back(Node(i,j)) ;
   }
  /* for(int i=0;i<=9;i++)
      for(int j=0;j<vec[i].size();j++)
          printf("%d ,%d  %d
",i ,vec[i][j].X,vec[i][j].Y) ;*/
}
int A[10] ,B[10];
int gao(int id){
    int sum=0 ;
    for(int i=0;i<vec[id].size();i++){
         int x=vec[id][i].X ;
         int y=vec[id][i].Y ;
         while(A[x]&&B[y]){
            sum++ ;
            A[x]-- ;
            B[y]-- ;
         }
         while(A[y]&&B[x]){
            sum++ ;
            A[y]-- ;
            B[x]-- ;
         }
    }
    return sum ;
}
int gan(){
    for(int id=9;id>=0;id--){
        for(int i=1;i<vec[id].size();i++){
             int x=vec[id][i].X ;
             int y=vec[id][i].Y ;
             if(A[x]&&B[y]){
                A[x]-- ;
                B[y]-- ;
                return id ;
             }
             if(A[y]&&B[x]){
                A[y]-- ;
                B[x]-- ;
                return id ;
             }
        }
    }
    return 0 ;
}
char strA[size] ,strB[size] ;
int ans[size] ;
int main(){
   init() ;
   int T ,k=1;
   cin>>T ;
   while(T--){
       scanf("%s",strA)  ;
       scanf("%s",strB)  ;
       printf("Case #%d: ",k++) ;
       int LA=strlen(strA) ;
       int LB=strlen(strB) ;
       memset(A,0,sizeof(A)) ;
       memset(B,0,sizeof(B)) ;
       for(int i=0;i<LA;i++)
          A[strA[i]-'0']++ ;
       for(int i=0;i<LB;i++)
          B[strB[i]-'0']++ ;
       if(strcmp(strA,"0")==0){
            puts(strB) ;
            continue  ;
       }
       if(strcmp(strB,"0")==0){
            puts(strA) ;
            continue  ;
       }
       int ind=0 ;
       ans[++ind]=gan();
       //cout<<ans[1]<<endl ;
       for(int id=9;id>=0;id--){
          int much=gao(id) ;
          for(int i=1;i<=much;i++)
              ans[++ind]=id ;
       }
       int i ;
       for(i=1;i<=ind;i++){
           if(ans[i]!=0)
               break  ;
       }
       if(i==ind+1){
           puts("0") ;
           continue ;
       }
       else{
          for(int j=i;j<=ind;j++)
              printf("%d",ans[j]) ;
          puts("") ;
       }
   }
   return 0 ;
}

  

原文地址:https://www.cnblogs.com/liyangtianmen/p/3317152.html