POJ 1744 Elevator Stopping Plan


题意: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;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值