题意:等大的立方体搭积木,每个立方体可以直接放在地上或放在另一个正方体的正上方,给出正视图和侧视图,问最少要用多少个正方体。
题解:可以先想如何形成正视图或侧视图,那么就是二维平面,正视图(侧视图)上有多少个正方形就是有多少个正方体,然后在这个基础上侧视图(正视图)如果出现新的列(之前视图不相等)的,就要新摆放一个,否则通过平移可以看做同一列,就不需要添加正方体了,那么可以得出,最少数量正方体就是正视图或侧视图中正方形多的那个视图,把它上面的正方形数量加上另一个视图上没有出现过的所有列就是最终解,用一个map就能解决。
#include <stdio.h>
#include <string.h>
const int N = 25;
int c, r, m[N], a1[N], a2[N];
int main() {
while (scanf("%d%d", &c, &r) && c) {
memset(m, 0, sizeof(m));
int sum1 = 0, sum2 = 0;
for (int i = 0; i < c; i++) {
scanf("%d", &a1[i]);
sum1 += a1[i];
}
for (int i = 0; i < r; i++) {
scanf("%d", &a2[i]);
sum2 += a2[i];
}
if (sum1 > sum2) {
for (int i = 0; i < c; i++)
m[a1[i]]++;
for (int i = 0; i < r; i++)
if (!m[a2[i]])
sum1 += a2[i];
else
m[a2[i]]--;
printf("%d\n", sum1);
}
else {
for (int i = 0; i < r; i++)
m[a2[i]]++;
for (int i = 0; i < c; i++)
if (!m[a1[i]])
sum2 += a1[i];
else
m[a1[i]]--;
printf("%d\n", sum2);
}
}
return 0;
}