PAT 1060 爱丁顿数 (25分)
1060 爱丁顿数 (25分)
英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” 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
解析:(4)(5 5 5 4) 的答案应该是3,而不是0
解法1:一个测试点运行超时
#include<iostream>
using namespace std;
int main()
{
cout << "sfh" << endl;
int N, n[100000];
cin >> N;
for(int i = 0; i < N; i++){
cin >> n[i];
}
int max = 0;
for(int i = N; i >= 1; i--){
int sum = 0;
for(int j = 0; j < N; j++){
if(n[j] > i)
sum++;
}
if(sum >= i){
sum = i;
if(max < sum)
max = sum;
}
}
cout << max;
return 0;
}
解法二:调运sort函数排序,主函数只需遍历一次即可
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int N, n[100020];
cin >> N;
for(int i = 0; i < N; i++){
cin >> n[i];
}
int max = 0, t = 0;
sort(n, n + N, cmp);
while(max <= N && n[t] > t + 1)
{
max++;
t++;
}
cout << max;
return 0;
}