题意:
给出前视图和右视图,计算出最少需要几个正方体以及至多可再增加几个正方体。
解析:
最少的情况就是如果能抵消掉的,就尽量让其抵消,高度相同的只需取一个,高度不同的都要取。
最多的话直接模拟,先将正视图一行一行的摆放,然后再讲右视图一列一列的摆放,在放置右视图的过程中只能取较小的。
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
const int N = 10;
const int MAXH = 1005;
int cntf[MAXH], cntr[MAXH];
int f[N], r[N], grid[N][N];
int n;
int main() {
int T;
scanf("%d",&T);
while(T--){
int minv = 0, maxv = 0;
memset(cntf, 0, sizeof(cntf));
memset(cntr, 0, sizeof(cntr));
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &f[i]);
cntf[f[i]]++;
}
for(int i = 0; i < n; i++) {
scanf("%d", &r[i]);
cntr[r[i]]++;
}
for(int i = 0; i < MAXH; i++) {
minv += max(cntf[i], cntr[i]) * i;
}
for(int i = 0; i < n; i++) {
memcpy(grid[i], f, sizeof(f));
}
for(int k = 0, i = n-1; k < n; i--, k++) {
for(int j = 0; j < n; j++) {
grid[i][j] = min(grid[i][j], r[k]);
maxv += grid[i][j];
}
}
printf("Matty needs at least %d blocks, and can add at most %d extra blocks.\n",minv, maxv-minv);
}
return 0;
}