K - Kia's Calculation(贪心)
Posted buhuiflydepig
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K - Kia's Calculation(贪心)相关的知识,希望对你有一定的参考价值。
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 ?
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.
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("\n"); return 0;
以上是关于K - Kia's Calculation(贪心)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 4965 Fast Matrix Calculation(矩阵高速幂)
HDU多校赛第9场 HDU 4965Fast Matrix Calculation矩阵运算+数学小知识