题目链接:https://cn.vjudge.net/contest/158558#problem/E
https://odzkskevi.qnssl.com/7bdafb89605bd39aff640413e2d2157a?v=1493120459
题目不好复制,直接上链接吧,题目的意思就是说我们现在有n堆砖头,现在我们有两种操作,一种是超过x的堆,每一堆的个数都减一,x自己操作,另一种操作是直接清空一堆,所以我们直接排序,a[i]超过i的直接清一堆。仔细一想就明白了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int main(){
int n;
cin>>n;
int i, j;
for(i=0; i<n; i++){
scanf("%d", &a[i]);
}
sort(a, a+n);
int ans=n;
for(i=0; i<n; i++){
ans=min(ans, a[i]+n-i-1);
}
printf("%d\n", ans);
}