1. 程式人生 > >UVa LA 4636 Cubist Artwork 難度: 0

UVa LA 4636 Cubist Artwork 難度: 0

要求 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() {
    
int 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; }
View Code

UVa LA 4636 Cubist Artwork 難度: 0