(貪心)cf#523-B.Views Matter
阿新 • • 發佈:2018-11-28
http://codeforces.com/contest/1061
給出x,y,呈現俯檢視和側檢視,求可以去掉多少塊是這兩個檢視不改變
5 6
3 3 3 3 3
10
首先想到排序,由大到小,在n+1個位置增加一個0的高度塊用於解第n個塊。
從第2個塊開始
對於前一個塊高度更高時,已使用塊數目 += 高度差
對於當前塊比前一塊高度相等或者更大時,因為俯檢視不能變,所以至少留下一塊,即已使用塊數目++,將當前塊高設為 前一塊高-1。特判前一塊高度為0時,直接將已使用塊數目 += 未處理的數量
相當於用高度設為已處理的y軸,特判為0的情況就行,解法很多。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; typedef long long ll; int a[maxn]; bool cmp(int x, int y) { return x > y; } int main() { int n, m; while(cin >> n >> m) { ll ans = 0; for(int i = 1; i <= n; i++) { cin >> a[i]; ans += a[i]; } sort(a + 1, a + n + 1, cmp); a[n + 1] = 0; ll x = 0; for(int i = 2; i <= n + 1; i++) { if(a[i - 1] > a[i]) x += a[i - 1] - a[i]; else { if(a[i - 1] == 0) { x += n - i + 2; break; } else x++, a[i] = a[i - 1] - 1; } } cout << ans - x << endl; } }