一【题目难度】
- 乙级
二【题目编号】
- 1060 爱丁顿数 (25 分)
三【题目描述】
- 英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E E E ,即满足有 E E E 天骑车超过 E E E 英里的最大整数 E E E。据说爱丁顿自己的 E E E 等于 87 87 87。
- 现给定某人 N N N 天的骑车距离,请你算出对应的爱丁顿数 E ( ≤ N ) E(≤N) E(≤N)。
四【题目示例】
-
输入格式:
输入第一行给出一个正整数 N ( ≤ 1 0 5 ) N (≤10^5 ) N(≤105),即连续骑车的天数;第二行给出 N N N 个非负整数,代表每天的骑车距离。 -
输出格式:
在一行中给出 N N N 天的爱丁顿数。 -
输入样例:
10
6 7 6 9 3 10 8 2 7 8 -
输出样例:
6
五【解题思路】
- 对数组从大到小排序,数组的索引下标当作从1开始,记为index,index表示骑车天数,数组index位置的值表示骑车距离,如果骑车距离大于骑车天数,即nums[index]>inedx(注意要当作从1开始,在代码中因为数组从0开始,那么就是nums[index]>inedx+1),即为满足条件的,向右遍历,E就会增大,由于数组从大到小排序,如果当前骑车距离小于或等于骑车天数,说明右边都不满足题意,最后输出结果即可
六【最终得分】
- 25分
七【代码实现】
#include<stdio.h>
#include<stdlib.h>
int cmp_1060_EddingtonNumber(const void *a,const void *b)
{
return *(int *)a < *(int *)b;
}
int main()
{
int n;
scanf("%d",&n);
int* nums = (int*)calloc(n,sizeof(int));
for(int i = 0;i<n;i++)
{
scanf("%d",&nums[i]);
}
qsort(nums,n,sizeof(int),cmp_1060_EddingtonNumber);
int index = 0,max = 0;
while(max <= n && nums[index] > index + 1)
{
max++;
index++;
}
printf("%d",max);
return 0;
}