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.逆序排序数组
总结:
读题很重要!
虽然没能全部通过测试用例,但学到了别人优秀的代码,收获还是很大的
标签:std,PAT,int,1060,list,C++,++,num,include 来源: https://blog.csdn.net/m0_50829573/article/details/121887049