1. 程式人生 > >(貪心)cf#523-B.Views Matter

(貪心)cf#523-B.Views Matter

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;
	}
}