USACO 2009 Dec Bobsledding

来源:互联网 发布:linux shell脚本教程 编辑:程序博客网 时间:2024/06/04 19:30
先把点按T排个序,再预处理一下,就是如果前一个点的速度减去与前一个点的距离都比这一个点的速度大,则将前一个点的速度改为这一个点的速度+两点距离.

预处理完之后,我们有在上一个点的速度和下一个点的速度,先让他们两个速度一样,然后剩下l的时间,除以2加上现在速度v,更新一下答案就好.

所以O(N)扫一遍就好了

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define M 100005using namespace std;struct W{    int s,t;    bool operator <(const W &a)const{        return t<a.t;    }}Q[M];int main(){    int l,n;    scanf("%d %d",&l,&n);    for(int i=1;i<=n;i++)scanf("%d %d",&Q[i].t,&Q[i].s);    sort(Q+1,Q+n+1);    for(int i=n-1;i>=1;i--)Q[i].s=min(Q[i].s,Q[i+1].s+Q[i+1].t-Q[i].t);    int ans=0,v=1;    Q[0].t=0;    for(int i=1;i<=n;i++){        int l=Q[i].t-Q[i-1].t;        if(Q[i].s-v>l)ans=max(ans,v+l),v+=l;        else {            if(v>Q[i].s){                l-=v-Q[i].s;                ans=max(ans,v+l/2);            }else if(v<Q[i].s){                l-=Q[i].s-v;                ans=max(ans,Q[i].s+l/2);            }else if(v==Q[i].s){                ans=max(ans,v+l/2);            }            v=Q[i].s;        }    }    ans=max(ans,v+l-Q[n].t);    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击