题目内容:
英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数”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
思路分析:
题目要求总共有E天骑行公里数大于E,于是想到了桶排序,通过数组下标统计骑行公里数等于下标的天数。
之后从0开始向上遍历,遍历过程中,查询的公里数逐渐变大,骑行超过当前公里数的天数逐渐减少,当两者最接近的时候,就是题目要求的答案。
代码:
#include <stdio.h>
int main()
{
int a[200000] = {0}, n = 0, tmp, sum = 0, max = 0, result = 0;
// 题目中只说骑行公里数为非负,却没说多大,这里的200000是通过提交试出来的
scanf("%d", &n);
for (int i = 0; i < n; i++, a[tmp]++) { // 读取每日骑行公里数,在对应位累计天数
scanf("%d", &tmp);
if (tmp > max) max = tmp; // 这里判断最大值,记录骑行的最大公里数
}
for (int i = 0; i <= max; i++) { // 遍历记录表,到最大公里数为止
tmp = i; // 当前查询的公里数
sum += a[i]; // 小于等于当前公里数的天数
if (tmp <= n - sum) // 大于当前公里数的天数如果比当前公里数大
result = tmp; // 符合条件记录结果
else
break; // 不符合条件退出循环
}
printf("%d", result); // 输出结果
return 0;
}