题目链接: 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;
}