zoukankan      html  css  js  c++  java
  • K

    Kia's Calculation

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


    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

    算法:贪心

    题解:根据题目意思来,我们只要将所有的数字出现的个数都记录一下(桶排),然后你就遍历依次相加取最大就行了。要注意的你需要单独判断第一个数,它不能有0,因为你的变化是不能把0变成第一位的,然后你还要注意的是,你的结果不能有前导0。

    #include <iostream>
    #include <cstdio>
    #include <memory.h>
    
    using namespace std;
    
    int visa[15], visb[15];
    char ans[1000007];
    string a, b;
    
    int main() {
        int T;
        int cas = 0;
        scanf("%d", &T);
        while(T--) {
            for(int i = 0; i < 10; i++) {
                visa[i] = visb[i] = 0;
            }
            cin >> a >> b;
            int lena = a.size();
            int lenb = b.size();
            for(int i = 0; i < lena; i++) {
                visa[a[i] - '0']++;
            }
            for(int i = 0; i < lenb; i++) {
                visb[b[i] - '0']++;
            }
            int posa, posb, maxx = -1;
            for(int i = 0; i < 10; i++) {    //找出第一个数
                for(int j = 0; j < 10; j++) {
                    if(i != 0 && j != 0 && visa[i] && visb[j] && maxx < (i + j) % 10) {
                        maxx = (i + j) % 10;
                        posa = i;
                        posb = j;
                    }
                }
            }
            int len = 0;
            printf("Case #%d: ", ++cas);
            if(maxx >= 0) {    //如果第一个数存在,则存储下来
                ans[len++] = maxx + '0';
                visa[posa]--;
                visb[posb]--;
            }
            for(int k = 9; k >= 0; k--) {        //寻找之后的数字,每次取最大
                for(int i = 0; i < 10; i++) {
                    for(int j = 0; j < 10; j++) {
                        while(visa[i] > 0 && visb[j] > 0 && (i + j) % 10 == k) {
                            visa[i]--;
                            visb[j]--;
                            ans[len++] = k + '0';
                        }
                    }
                }
            }
            int mark = 1;
            for(int i = 0; i < len; i++) {    //需要判断前导0
                if(mark && i == len - 1) {
                    printf("%c", ans[i]);
                } else if(mark && ans[i] != '0') {
                    mark = 0;
                    printf("%c", ans[i]);
                } else if(!mark) {
                    printf("%c", ans[i]);
                }
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    小白月赛4 A 三角形
    小白月赛4 A 三角形
    Trouble HDU
    Trouble HDU
    K
    K
    2016年第七届蓝桥杯C/C++ A组国赛 —— 第一题:随意组合
    2016年第七届蓝桥杯C/C++ B组国赛 —— 第一题:一步之遥
    2016年第七届蓝桥杯C/C++ B组国赛 —— 第一题:一步之遥
    Koch Curve Aizu
  • 原文地址:https://www.cnblogs.com/buhuiflydepig/p/11392832.html
Copyright © 2011-2022 走看看