爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。据说爱丁顿自己的 E 等于87。
现给定某人 N 天的骑车距离,请你算出对应的爱丁顿数 E(≤N)。
输入格式:
10
6 7 6 9 3 10 8 2 7 8
输出样例:6
思路:
对每天骑车距离的数组进行排序(归并排序迭代版)
#include<stdio.h>
#include<stdlib.h>
int findmin(int a, int b) {
return a > b ?b :a ;
}
void merge(int arr[], int L, int M, int R) {
int help[50] = { 0 };
int p1 = L;
int p2 = M + 1;
int i = L;
while (p1 <= M && p2 <= R) {
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= M) {
help[i++] = arr[p1++];
}
while (p2 <= R) {
help[i++] = arr[p2++];
}
int j = L;
while (j <= R) {
arr[j] = help[j];
j++;
}
}
//归并排序迭代版
int process2(int arr[], int L, int R) {
int len = R - L + 1;
if (arr==NULL||len<2){ return 0; }
//规定步长step初始步长为1
int step = 1;
while (step<len)//步长不可以大于数组长度
{
int l = 0;
while (l<len)//l是:当前左组的第一个位置
{
int m = l + step-1;
if (m >= len) { break; }//如果连右组前一位都大于len,跳出这个while循环,直接步长*2
int r = findmin(R, m + step);
merge(arr, l, m, r);
l = r + 1;
}
if (step>len/2) {
break;
}
step = step * 2;
}
return 0;
}
//归并排序递归版
void process(int arr[], int L, int R) {
if (L < R) {
int M = (L + R) / 2;
process(arr, L, M);
process(arr, M + 1, R);
merge(arr, L, M, R);
}
}
int main(void) {
int N=0;
scanf("%d", &N);
int* arr = (int*)malloc(sizeof(int));
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
//process(arr,0,N-1);
process2(arr, 0, N - 1);
for (int j = 0; j < N; j++) {
if (arr[j] > N - j) {
printf("%d", arr[j - 1]);
break;
}
}
return 0;
}