目的:找到E数
输入:
N 连续骑车的天数
N个每天骑行时间的序列
输出
输出E
E为最大的E,至少E天骑行超过E小时
算法:
要找到一个最大的时间E,在骑行超过这个时间里面骑行的天数是超过E天的。也就是找到最小的E,骑行超过E小时的天数是不到E天的。用二分法
#include<stdio.h>
const int maxn = 100010;
int num[maxn] = {0};
int N;
int finde(int left,int right)
{
int mid;
while(left<right)
{
mid = (left+right)/2;
int cnt = 0;
for(int i=0;i<N;i++)
{
if(num[i]>mid)
{
cnt++;
}
}
if(mid<=cnt)
{
left = mid +1;
}else
{
right = mid;
}
}
return left;
}
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
{
scanf("%d",&num[i]);
}
printf("%d",finde(1,N+1)-1);
return 0;
}
算法:开始理解错误。以为是E小时刚好E天。其实不小于E天就好。
优质算法,将所有骑行时间从大到小排序,找到a[i]>i+1的最大i,其实题目转换个思路就是,找到骑行时间最多的E天,里面其实时间最少也超过E。也就是找到最小的E,就是E天里面骑行时间第E长(最短)的一天,时间小于E。然后E-1就为结果。