http://codeforces.com/contest/1061/problem/B
题意:最多能去除多少个块使得从右面和上面看下去和原图一样
思路:先把每一列进行排序,每一列选择一个或者多个,视情况而定,拍完序就很明了了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
#define mod 1000000007
#define inf 0x3f3f3f3f
using namespace std;
#define ll long long
int main()
{
int n, m;
scanf("%d%d",&n,&m);
int a[100005];
for(int i = 1; i <= n; i ++)
{
scanf("%d",&a[i]);
}
sort(a + 1, a + 1 + n);
int h = a[n];
ll ans = 0;
int now = 0;
for(int i = 1; i <= n; i ++)
{
if(a[i] >= now + 1)
{
if(now + 1 <= h)
now ++;
ans += (a[i] - 1);
}
else
{
ans += (a[i] - 1);
}
}
//cout<<now<<endl;
if(h == now) cout<<ans<<endl;
else
cout<<ans - (h - now)<<endl;
return 0;
}