UVALive - 2949 Elevator Stopping Plan

来源:互联网 发布:数控铣简单图案编程 编辑:程序博客网 时间:2024/05/16 07:20

把我坑惨了。。。

二分时间,之后是贪心,有点类似于选择尽量少的点去覆盖区间,要选择第一个区间的最后一个点。

注意,开始的几个点,如果楼层比较低,以至于直接走上去都可以,就直接跳过不考虑。

uvalive不知怎么不判题了,在poj上交的

#include<cstdio>#include<cstring>#include<algorithm>#define MAX 35000using namespace std;int input[MAX],front,rear,mid;int main(){    int n,i,j,time,cur,start,y,all,ans[MAX];    while(scanf("%d",&n)&&n)    {        for(i=0;i<n;i++)            scanf("%d",&input[i]);        sort(input,input+n);        rear=500000000,front=0;        while(front+1<rear)        {            mid=(front+rear)/2;            time=0,start=1,all=0;            for(cur=0;cur<n;cur++)                if(input[cur]>mid/20+1)                break;            if(cur==n)                time=input[n-1]*20-20;;            while(cur<n)            {                y=(4*start+20*input[cur]+mid-time)/24;                if(y<start)                {                    front=mid;                    goto next;                }                if(y>input[n-1])                    y=input[n-1];                ans[all++]=y;                for(i=cur;i<n;i++)                {                    if(time+(y-start)*4+(input[i]-y)*20>mid)//写错一次                    {                        break;                    }                }                cur=i;                time+=(y-start)*4+10;                if(cur==n)                    time-=10;                start=y;            }            if(time>mid)                front=mid;            else                rear=mid;                next:{}        }        printf("%d\n",rear);        //printf("%d",all);        //for(i=0;i<all;i++)        //    printf(" %d",ans[i]);       // puts("");    }    return 0;}


0 0
原创粉丝点击