Codeforces Round #523 (Div. 2) B. Views Matter 思维

题解

题目大意 给一排货物的堆积高度 在保证俯视图和右视图不发生变化的情况下最多能移除多少货物 货物可以浮空

先将高度排序 尽量每个位置只保留一个货物 则这个位置可以移除的数量为a[i] - 1 这个货物的高度为h 每次向右一个格h尽量增加一个高度 到最后将h与a[N]的高度差从答案中扣除

AC代码

#include 
#include 
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 10;
int a[MAXN];

int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	int N, M;
	cin >> N >> M;
	for (int i = 1; i <= N; i++)
		scanf("%d", &a[i]);
	sort(a + 1, a + N + 1);
	ll ans = 0;
	int h = 0; //高度
	for (int i = 1; i <= N; i++)
	{
		h = min(h + 1, a[i]); //尽量每一向右一个格子增加一个高度
		ans += max(0, a[i] - 1); //每列使用一个方块其它都为答案
	}
	cout << ans + h - a[N] << endl; //最后一个格子减去剩余高度差

	return 0;
}

你可能感兴趣的:(Codeforces)