HDU 4726 Kia's Calculation (贪心)

来源:互联网 发布:手机印章制作软件 编辑:程序博客网 时间:2024/03/29 23:06

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4726

思路:贪心,尽量先组大的数字,注意考虑前导零的情况

代码:

#include <stdio.h>#include <string.h>const int N = 1000005;int t, v1[10], v2[10], ans[N];char s1[N], s2[N];void solve() {    int n = strlen(s1);    if (n == 1) {ans[0] = (s1[0] - '0' + s2[0] - '0') % 10;printf("%d\n", ans[0]);return;    }    for (int i = 9; i >= 0; i--) {int flag = 0;for (int j = 1; j <= 9; j++) {    int k = (10 + i - j) % 10;    if (k == 0) continue;    if (v1[j] && v2[k]) {v1[j]--;v2[k]--;ans[0] = i;flag = 1;break;    }}if (flag) break;    }    for (int i = 1; i < n; i++) {int flag = 0;for (int j = 9; j >= 0; j--) {    for (int k = 0; k <= 9; k++) {int kk = (10 + j - k) % 10;if (v1[k] && v2[kk]) {    v1[k]--;    v2[kk]--;    ans[i] = j;    flag = 1;    break;}    }    if (flag) break;}    }    int flag = 0;    for (int i = 0; i < n; i++) {if (ans[i] != 0 || flag) {    printf("%d", ans[i]);    flag = 1;}if (flag == 0) continue;    }    if (flag == 0) printf("0");    printf("\n");}int main() {    int cas = 0;    scanf("%d", &t);    while (t--) {memset(v1, 0, sizeof(v1));memset(v2, 0, sizeof(v2));scanf("%s%s", s1, s2);int l1 = strlen(s1), l2 = strlen(s2);for (int i = 0; i < l1; i++)    v1[s1[i] - '0']++;for (int i = 0; i < l2; i++)    v2[s2[i] - '0']++;printf("Case #%d: ", ++cas);solve();    }    return 0;}


1 0
原创粉丝点击