noip模拟赛 隔壁
分析:体积最大的比较好处理,对于第(i,j)格的高度取min(a[i],b[j])就好了,保证让每个格子的高度最大.对于最小的情况,只要让第i列上有一个格子高度为a[i],其它全是0,第j行有一个高度为b[j],其它全是0就好了.如果a,b中有相同的元素,那么它们可以共用一个格子,因为最后每个高度都要取到,还要减去共用格子的高度,所以答案为Σa[i] + Σb[j] - Σ共用格子的高度*个数.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n, m, sum, a[1010], b[1010], ans, cnt, tot[1010]; int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum += a[i]; } for (int i = 1; i <= m; i++) { scanf("%d", &b[i]); sum += b[i]; } sort(a + 1, a + 1 + n); sort(b + 1, b + 1 + m); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) ans += min(a[i], b[j]); for (int i = 1; i <= n; i++) tot[a[i]]++; cnt = unique(a + 1, a + 1 + n) - a - 1; for (int i = 1; i <= cnt; i++) { int tott = 0; for (int j = 1; j <= m; j++) if (b[j] == a[i]) tott++; sum -= min(tott, tot[a[i]]) * a[i]; } printf("%d %d\n", sum, ans); return 0; }