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