找到规律后非常简单。
就是里程数大于i英里的天数大于等于i,输出最大的i即可。
数组cnt[i]保存每英里的天数,比如6英里有两天,8英里有两天。然后从前加到后,这时数组里保存的就是里程数小于等于i公里的天数。里程数大于N的天数一律视作里程数N+1.然后用cnt[N+1]-cnt[i]得到里程数大于i英里的天数,与i作比较即可。
时间复杂度为O(N)。
#include<stdio.h>
#include<memory.h>
#include<Windows.h>
int cnt[100001];
int main()
{
memset(cnt, 0, 100001);
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
int distance;
scanf("%d", &distance);
if (distance > N)
{
cnt[N + 1]++;
}
else
{
cnt[distance]++;
}
}
for (int i = 1; i <= N + 1; i++)
{
cnt[i] += cnt[i - 1];
}
int ans = 0;
for (int i = 0; i <= N; i++)
{
if (cnt[N + 1] - cnt[i] >= i)
{
ans = i;
}
}
printf("%d\n", ans);
return 0;
}