题目链接:1060 爱丁顿数
思路
- 纸笔模拟了一下,要找到最大的K,满足大于K的数有K个。先将数据先降序排列,根据下标就可以知道小于当前数的数有多少个。
- 因为K是整数,可以减1把自己囊括进去,省的再判断下一位是不是一样,也能保证找到的是最大的整数K。
- 每轮选取min{num-1,i+1}作为E,当发现当前判断的数比E还小时,已经不可能有更大的E了,此时得到结果。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b){
return a > b;
}
int main(){
int N, E = 0;
cin >> N;
int a[N];
for(int i=0;i<N;i++) cin >> a[i];
sort(a, a+N, cmp);
int min = a[0];
for(int i=0;i<N;i++){
if(a[i] - 1 < min) min = a[i] - 1;
if(E >= min) break;
E = min < i + 1 ? min : i + 1;
}
cout << E << endl;
return 0;
}