POJ 1744 Elevator Stopping Plan

来源:互联网 发布:mac杀毒软件 编辑:程序博客网 时间:2024/05/24 06:32


题意:N个人要到f1,f2...fn层楼,已知电梯每升一层要4秒,到某一层要停留10秒,人爬楼梯上一层要20秒。求出所有人都到达自己想去的楼层的最短时间。

分析:二分+贪心。对时间二分,贪心的判断在这固定的时间内是否能让所有人到达自己想去的楼层。贪心的判断就是让电梯尽可能的往上跑,以给要到较高楼层的人节省中间停留时间,而让时间比较充裕的到较低层的人尽可能多走楼梯,从而让总体时间最小。


Code:

#include<iostream>#include<cstring>#include<cstdio>using namespace std;int fl[30010];int n;bool OK(int time){    int pos=1,nt=0,np;    bool mark=false;    for(int i=0;i<n;i++){        if((fl[i]-pos)*20+nt>time){            if(mark) nt+=10;            if((fl[i]-pos)*4+nt>time) return false;            for(np=fl[i];(np-pos)*4+(np-fl[i])*20+nt<=time;np++);            np--;            nt+=(np-pos)*4;            pos=np; mark=true;        }    }    return true;}int main(){    int st,ed;    while(scanf("%d",&n),n){        for(int i=0;i<n;i++){            scanf("%d",&fl[i]);        }        st=(fl[0]-1)*4-1;        ed=(fl[n-1]-1)*20;        while(ed-st>1){            int m=(st+ed)>>1;            if(OK(m)) ed=m;            else      st=m;        }        printf("%d\n",ed);    }    return 0;}


原创粉丝点击