C/C++教程

PAT乙级刷题/1060 爱丁顿数/C++实现

本文主要是介绍PAT乙级刷题/1060 爱丁顿数/C++实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、题目描述

英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。据说爱丁顿自己的 E 等于87。

现给定某人 N 天的骑车距离,请你算出对应的爱丁顿数 E(≤N)。

输入格式:

输入第一行给出一个正整数 N (≤105),即连续骑车的天数;第二行给出 N 个非负整数,代表每天的骑车距离。

输出格式:

在一行中给出 N 天的爱丁顿数。

输入样例:

10
6 7 6 9 3 10 8 2 7 8
结尾无空行

输出样例:

6

二、题解代码以及提交截图

第一次提交代码、截图以及思路:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    int N,num,count = 0;
    std::cin >> N;
    std::vector<int> list,list1;
    for(int i = 0;i < N;i++){
        std::cin >> num;
        list.push_back(num);
    }
    sort(list.begin(),list.end());
    for(int i = 0;i < list.size();i++){
        for(int j = i + 1;j < list.size();j++){
            if(list[j] > list[i]){
                count++;
            }
        }
        if(count >= list[i]){
            list1.push_back(list[i]);
        }
        count = 0;
    }
    sort(list1.begin(),list1.end());
    std::cout << list1[list1.size() - 1];
}

 思路:

存在动态数组list,利用sort函数排序,利用for循环遍历,把符合题意的数字存在动态数组list1中,输出最大值即可。

 发现出现错误、超时了

 读题后,发现自己思路有问题,认为数字就是从给定的数组里找出的,因此整个代码的思路就是错误的

第二次提交代码以及截图:

#include <iostream>
#include <vector>

int main()
{
    int N,num;
    std::cin >> N;
    std::vector<int> list;
    for(int i = 0;i < N;i++)
    {
        std::cin >> num;
        list.push_back(num);
    }
    int M;
    for(int k = 0;k <= N;k++)
    {
        int count = 0;
        for(int l = 0;l < N;l++)
        {
            if(list[l] > k)
            {
                count++;
            }
        }
        if(count >= k)
            M = k;
    }
    std::cout << M;
    return 0 ;
}

 思路还是第一次类似,只不过不从0-N开始找符合题意的数字

但出现超时问题了

三、总结学习

CSDN大神的优秀代码

#include <iostream>
#include <algorithm>
using namespace std;
int a[1000000];
bool cmp1(int a, int b) {
    return a > b;
}
int main() {
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    sort(a+1, a+n+1, cmp1);
    int ans = 0, p = 1;
    while(ans <= n && a[p] > p) {
        ans++;
        p++;
    }
    printf("%d", ans);
    return 0;
}
 

思路:

 1.逆序排序数组


2.使用ans 和p两个变量进入while循环进行判断,跳出循环后直接输出

总结:

读题很重要!

虽然没能全部通过测试用例,但学到了别人优秀的代码,收获还是很大的 

这篇关于PAT乙级刷题/1060 爱丁顿数/C++实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!