兩次二分,因為題意是求m次能過河的前提下最小跳躍長度,第一次二分是對答案二分,第二次是對石頭二分
那個lower_bound雖好用,不過它只能返回的id的值小於val,也就是說有數組a[0]=0,a[1]=2,a[2]=6,lower_bound(a,a+n,6)-a=1,即a[1]=2,正確是返回2,即a[2]=6,所以這時候應該處理一下。
#include <list>#include <map>#include <set>#include <queue>#include <string>#include <deque>#include <stack>#include <algorithm>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>#include <time.h>#include <string.h>using namespace std;#define LL long long#define PI acos(-1.0)#define MAX INT_MAX#define MIN INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)#define MOD 1000000007#define N 500005int a[N];int m;int n;int l;bool gao(int x){ int pos=0,id; int cnt=1; while(cnt<=m){ pos+=x; id=lower_bound(a+1,a+2+n,pos)-a-1; if(pos==a[id+1])id++; if(a[id]==l){ return true; } pos=a[id]; cnt++; } return false;}int main(){ while(scanf("%d%d%d",&l,&n,&m)!=EOF){ int i; for(i=1;i<=n;i++)scanf("%d",&a[i]); a[i]=l; sort(a+1,a+n+2); int ll=0,rr=l,mid; int ans; while(ll<=rr){ mid=(ll+rr)>>1; if(gao(mid)){ ans=mid; rr=mid-1; } else ll=mid+1; } printf("%d\n",ans); } return 0;}