(贪心)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;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40588429/article/details/84400435
今日推荐