zoukankan      html  css  js  c++  java
  • 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 ;
    }
    

      

  • 相关阅读:
    row_number() over(partition by的用法
    java基础之--动态代理
    Java中主要有一下三种类加载器;
    HBase基本shell命令
    IntelliJ IDE 基础经验备案 四-查找快捷键
    Docker:5 扩展学习之安装mysql并且将数据挂载到本地磁盘
    Docker:4 扩展学习之修改docker容器配置
    nginx安装部署《简单版》
    Redis基础学习: 与外部交互的数据类型
    Redis基础学习: 内部数据结构
  • 原文地址:https://www.cnblogs.com/liyangtianmen/p/3317152.html
Copyright © 2011-2022 走看看