一、题目描述
英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” 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循环进行判断,跳出循环后直接输出
总结:
读题很重要!
虽然没能全部通过测试用例,但学到了别人优秀的代码,收获还是很大的