B. The Queue (贪心)

题目链接: B. The Queue

题意:

排队,给出服务的开始时间和 结束时间,然后服务一个人要多久时间。有n个人,知道他们的到达时间。求什么时候去排队时间最短。如果一个人和他一起到达,则让那个人先服务。

思路:

1.先找是否有空闲的时间,就是空窗期,有的话就这时候去,就不用排队。
2. 如果没有的话,并且和别人同时到达要让别人先,那么我们就比某个人提早一分钟到,那样就可以比他先服务,对每个人计算比他早一分钟到达需要的排队时间,最小值就是答案了。

代码:

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm> 
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f;
ll time[100005];
int main()
{

    ll ts,tf,k,n,i,j,f=1;
    scanf("%I64d%I64d%I64d%I64d",&ts,&tf,&k,&n);
    for(i=1;i<=n;++i)
    scanf("%I64d",&time[i]);
    //如果第一个人比开始时间晚到,那么那时候就是空窗期。
        if (time[1]>ts){
            cout<<ts<<endl;
            return 0;
        }
        //初始化 比第一个人早到一分钟的等待时间。
        ll min=ts-(time[1]-1),ans=time[1]-1;
        for(i=1;i<=n;++i)
        {
        //比第i个人早到的等待时间
            ll temp=(i-1)*k+ts-(time[i]-1);
            if(ts+i*k>tf)break;
            //是否有空窗期    
            if(ts+i*k<time[i+1])
            {

                ans=ts+i*k;
                min=-1;
                break;
            }
            //最小排队时间
            else if(temp<min)
            {

                min=temp;
                ans=time[i]-1;

            }
        } 
        if(k*(n+1)+ts<=tf&&min>0)ans=k*n+ts;
        cout<<ans;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/PinappleMi/article/details/80642783
今日推荐