题目链接: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;
}HDU 4726 Kia's Calculation (贪心),布布扣,bubuko.com
HDU 4726 Kia's Calculation (贪心)
原文地址:http://blog.csdn.net/accelerator_/article/details/25002343