【PAT乙级】1060 爱丁顿数

题目链接:1060 爱丁顿数

思路

  1. 纸笔模拟了一下,要找到最大的K,满足大于K的数有K个。先将数据先降序排列,根据下标就可以知道小于当前数的数有多少个。
  2. 因为K是整数,可以减1把自己囊括进去,省的再判断下一位是不是一样,也能保证找到的是最大的整数K。
  3. 每轮选取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;
}

猜你喜欢

转载自blog.csdn.net/wulingyu501/article/details/108974614