题目
英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E E E ,即满足有 E E E 天骑车超过$ E$ 英里的最大整数 E E E。据说爱丁顿自己的 E E E 等于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
思路
由于需要的信息是公里数,与每天的对应关系不大,使用数组 a a a存储骑车距离 i i i的天数 6 7 6 9 3 10 8 2 7 8 得到矩阵:
a [ 0 ] a[0] a[0] | a [ 1 ] a[1] a[1] | a [ 2 ] a[2] a[2] | a [ 3 ] a[3] a[3] | a [ 4 ] a[4] a[4] | a [ 5 ] a[5] a[5] | a [ 6 ] a[6] a[6] | a [ 7 ] a[7] a[7] | a [ 8 ] a[8] a[8] | a [ 9 ] a[9] a[9] | a [ 10 ] a[10] a[10] | a [ 11 ] a[11] a[11] | . . . ... ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 0 0 | 0 0 0 | 1 1 1 | 1 1 1 | 0 0 0 | 0 0 0 | 2 2 2 | 2 2 2 | 2 2 2 | 1 1 1 | 1 1 1 | 0 0 0 | 0 0 0 |
因此对于每个 i i i,骑车超过 i i i公里的天数可求得:
a ′ [ 0 ] a'[0] a′[0] | a ′ [ 1 ] a'[1] a′[1] | a ′ [ 2 ] a'[2] a′[2] | a ′ [ 3 ] a'[3] a′[3] | a ′ [ 4 ] a'[4] a′[4] | a ′ [ 5 ] a'[5] a′[5] | a ′ [ 6 ] a'[6] a′[6] | a ′ [ 7 ] a'[7] a′[7] | a ′ [ 8 ] a'[8] a′[8] | a ′ [ 9 ] a'[9] a′[9] | a ′ [ 10 ] a'[10] a′[10] | a ′ [ 11 ] a'[11] a′[11] | . . . ... ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|
10 10 10 | 10 10 10 | 9 9 9 | 8 8 8 | 8 8 8 | 8 8 8 | 6 6 6 | 4 4 4 | 2 2 2 | 1 1 1 | 0 0 0 | 0 0 0 | 0 0 0 |
很明显对于每个 a ′ [ i ] = a [ i + 1 ] + a ′ [ i + 1 ] a'[i]=a[i+1]+a'[i+1] a′[i]=a[i+1]+a′[i+1]。
因此倒序比较,第一个 a ′ [ i ] ≥ i a'[i]≥i a′[i]≥i的数即为爱丁顿数。
代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[100001] = { 0 }; // 存储骑车的公里数的天数
for (int i = 0; i < n; i++)
{
int d;
scanf("%d",&d);
if (d>n) // 大于n的公里数可以等价n+1,因为E的最大取值是n
a[n+1]++;
else
a[d]++;
}
int temp = 0;
for (int i = n; i >= 0; i--) // 找出第n天骑车超过n英里的整数
{
int num = a[i + 1] + temp;
temp = a[i];
a[i] = num;
if (a[i] >= i)
{
cout << i;
break;
}
}
}