• K


    Kia's Calculation

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


    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
     
    Recommend
    zhuyuanchen520
    /*
    * @Author: lyuc
    * @Date:   2017-04-28 19:34:17
    * @Last Modified by:   lyuc
    * @Last Modified time: 2017-04-28 20:19:20
    */
    
    /*题意:定义一种加法法则,两个整数相加的时候不用进位,现在给你两个位数相等的整数,用着每个整数任意组合,让你构造出
     *    两个数的和最大。
     *
     *思路:先统计每个数中的0-9个出现了多少次,然后最高位特殊处理,剩下的都构造最大的数
     */
    #include <bits/stdc++.h>
    #define MAXN 1000005
    using namespace std;
    int t;
    char s1[MAXN],s2[MAXN];
    int num[MAXN];//用来存放数字
    int vis[2][10];
    void init(){
        memset(vis,0,sizeof vis);
        memset(num,'',sizeof num);
    }
    int main(){
        // freopen("in.txt","r",stdin);
        scanf("%d",&t);
        for(int ca=1;ca<=t;ca++){
            printf("Case #%d: ",ca);
            init();
            scanf("%s%s",s1,s2);
            int n=strlen(s1);
            if(n==1){//如果只有一位的话,直接输出就可以了
                printf("%d
    ",(s1[0]-'0'+s2[0]-'0')%10);
                continue;
            }
            //统计每个数字出现的次数
            for(int i=0;i<n;i++){
                vis[0][s1[i]-'0']++;
                vis[1][s2[i]-'0']++;
            }
            for(int res=0;res<n;res++){//从最高位开始枚举
                for(int i=9;i>=0;i--){//i枚举的是给最后的和的第res位的数,因为要尽量找大的嘛,所以从9开始枚举
                    bool flag=false;
                    for(int j=0;j<=9;j++){
                        if(vis[0][j]==0) continue;//如果第一个数中没有出现的数字那么根本不需要考虑了
                        int ok=(i+10-j)%10;//ok表示和j(第一个数中出现的数字)组成i的在第二个数中出现的数字
                        if(res==0&&(j==0||ok==0)) continue;//如果是res==0(当前枚举的是最高位,那么就不能出现前导零)
                        if(vis[1][ok]){//如果ok在第二个数中还有那么就可以构造了
                            vis[0][j]--;
                            vis[1][ok]--;
                            num[res]=i;
                            flag=true;
                            break;
                        }
                    }
                    if(flag==true) break;
                }
            }
            int res=0;
            while(res<n&&num[res]==0) res++;//去前导零
            if(res==n){
                puts("0");
            }else{
                for(;res<n;res++){
                    printf("%d",num[res]);
                }
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    消息中间件(一)MQ详解及四大MQ比较
    WebSocket 详解教程
    Nginx 简易教程
    排序七 归并排序
    排序五 简单选择排序
    排序四 希尔排序
    排序二 快速排序
    排序一 冒泡排序
    [算法题] 人民币大小写转换(阿拉伯数字和汉字转换)
    Linux编程 18 安装软件程序(yum工具对软件包安装,删除,更新介绍)
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/6783166.html
Copyright © 2020-2023  润新知