题解
题目大意 给一排货物的堆积高度 在保证俯视图和右视图不发生变化的情况下最多能移除多少货物 货物可以浮空
先将高度排序 尽量每个位置只保留一个货物 则这个位置可以移除的数量为a[i] - 1 这个货物的高度为h 每次向右一个格h尽量增加一个高度 到最后将h与a[N]的高度差从答案中扣除
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
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;
}