PAT甲级1117 Eddington Number (25分)|C++实现

    科技2023-12-22  126

    一、题目描述

    原题链接

    Input Specification:

    ​​Output Specification:

    Sample Input

    10 6 7 6 9 3 10 8 2 7 8

    Sample Output:

    6

    二、解题思路

    一道巧妙的数学题,给我们一组数据,要我们找到最大的E,使得这组数字里有E个大于E的数。题目给的时间是250ms,如果我们直接遍历的话,很有可能会超时,我们这里可以换个思路。将所有数字从大到小排序,按顺序遍历,找到第一个数字小于下标的数,随后输出前一个数的下标即可。因为我们只需要找出超过E的数,与输入顺序无关,我们从大到小排序并不会影响结果,从小到大排序后,事实上下标就起到了一个计数的作用,比如下标为5的数字为6,而还没有退出程序,则说明第5天的骑行长度大于5,随后遍历到下标为6的数,假设其为6,那么我们就退出循环,因为6公里并不大于天数,而后面也不会有大于6的数了。基于这个思想,可写出十分简单的代码。

    三、AC代码

    #include<iostream> #include<cstdio> #include<string> #include<vector> #include<algorithm> using namespace std; bool cmp(int a, int b) { return a > b; } int main() { int N; scanf("%d", &N); vector<int> v(N+1); for(int i=1; i<=N; i++) scanf("%d", &v[i]); sort(v.begin()+1, v.end(), cmp); for(int i=1; i<=N; i++) { if(v[i] <= i) { printf("%d", i-1); return 0; } } printf("%d", N); return 0; }
    Processed: 0.025, SQL: 8