UVA 11627(p80)----Slalom

来源:互联网 发布:oracle数据库好学吗 编辑:程序博客网 时间:2024/04/29 04:09
#include<bits/stdc++.h>#define debuusing namespace std;const int maxn=1e6+50;int maxx,w,vh,n,s,ans,tmp;int x[maxn],y[maxn],ski[maxn];int check(int speed){    double l=(double)x[0],r=(double)(x[0]+w);    for(int i=1; i<n; i++)    {        double d=(double)(y[i]-y[i-1])/(double)speed*vh;        l-=d;r+=d;        l=max(l,(double)x[i]);        r=min(r,(double)(x[i]+w));        if(l>r) return 0;    }    return 1;}void solve(){    int l=0,r=maxx,mid;    while(l<r)    {        mid=l+(r-l+1)/2;        if(check(mid))        {            tmp=mid;            l=mid;        }        else r=mid-1;    }}void output(){    sort(ski,ski+s);    for(int i=0; i<s; i++)    {        if(ski[i]<=tmp) ans=ski[i];        else break;    }    if(ans!=-1) printf("%d\n",ans);    else printf("IMPOSSIBLE\n");}int main(){#ifdef debug    freopen("in.in","r",stdin);#endif // debug    int t;    scanf("%d",&t);    while(t--)    {        ans=-1;        tmp=-1;        maxx=0;        scanf("%d%d%d",&w,&vh,&n);        for(int i=0; i<n; i++)            scanf("%d%d",&x[i],&y[i]);        scanf("%d",&s);        for(int i=0; i<s; i++)        {            scanf("%d",&ski[i]);            maxx=max(maxx,ski[i]);        }        solve();        output();    }    return 0;}
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2674
题解:当速度越小时,越易成功穿过。二分速度v,寻找速度最大值,判断是否合法:求出当前可达区间,与下一位置区间求并,若不为空,则可到达下一位置。最后寻找小于等于v的最大速度即可。

0 0
原创粉丝点击