UVa LA 4636 Cubist Artwork 難度: 0
阿新 • • 發佈:2019-04-13
要求 epo cst show 從大到小 problem index.php namespace pri
題目
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2637
題意
積木,有左視圖和前視圖,問最少幾塊積木
思路
明顯,把前視圖視作列,左視圖視作行,從大到小排列行和列,如果此時未處理的行列最大值恰巧相等為h,那麽就是說在這個新行/列中,恰可以放一個高為h的積木。如果不相等且較大值為h,那麽就必須要做一個高為h的積木組,假如h是左視圖上的要求,那麽要把它放在列長大於等於h的列中掩蓋起來,防止前視圖中看到這個h高積木,因為前視圖看不到這個h高積木。
簡而言之,排個序,相同的只加一份,不同的各算一份。
代碼
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 1e3 + 3; typedef pair<int, int> Pair; int n, m; int a[MAXN], b[MAXN]; int main() {View Codeint T; //scanf("%d", &T); freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\input.txt", "r", stdin); //freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\output.txt", "w", stdout); for (int ti = 1; scanf("%d%d", &n, &m) == 2 && n && m; ti++) { for(int i = 0; i < n; i++) { scanf("%d", a + i); } sort(a, a + n); for (int i = 0; i < m; i++) { scanf("%d", b + i); } sort(b, b + m); int ans = 0; for (int i = n - 1, j = m - 1; i >= 0 || j >= 0;) { if (i < 0) { ans += b[j--]; } else if (j < 0) { ans += a[i--]; } else { if (a[i] == b[j]) { ans += a[i]; i--; j--; } else if (a[i] > b[j]) { ans += a[i--]; } else { ans += b[j--]; } } } printf("%d\n", ans); } return 0; }
UVa LA 4636 Cubist Artwork 難度: 0