https://mp.csdn.net/postedit/84366147
,自己画画图,排个序,(m就相当于a[n]了)每一行每一列至少有一个,所以先把每一行的都放一个,ans=n,然后遍历列,k是从低的行遍历到高的行,如果当前列能达到k高度,直接将原初放的那块,移到当前高度位置,不然,随便放就可以,自己画图想想,不难,
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100005],ans,s;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s+=a[i];
}
sort(a+1,a+n+1);
int k=1;
ans=n;
for(int i=1;i<=n;i++)
{
if(a[i]>=k)
{
k++;if(k>a[n]) break;
}
}
ans+=a[n]-k+1;
cout<<s-ans<<endl;
return 0;
}
/*
4 4
2 1 3 1
*/