【二分】hdu 4004

來源:互聯網
上載者:User

兩次二分,因為題意是求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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.