题意:
一群人排队办理业务,每次每个人办理业务的所花费的时间是k,且工作人员只在l-r时间段内工作,即r-1是最后工作的时间。给出你n个人来排队的时间,若你和某个人来的时候时间相同,则另一个先办理业务。问你你什么时候来办理业务所需要等待的时间最少?
k,l,r都是long long型的
思路:
模拟,每次模拟出你在第i个人前一秒来。记录当前处理完i-1个人时现在的时间,当前时间-第i个人来的时间+1(因为你得在他前一秒来)。
特判一下开头和结尾(这时候等待的时间可能是0)
注意:如果当前时间<第i个人来的时间说明等待时间为0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const ll maxn=1e15;
ll a[100000+100];
int main ()
{
ll st,ed;
ll k;
scanf("%lld%lld%lld",&st,&ed,&k);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
if(a[1]>st)
{
printf("%lld\n",st);
return 0;
}
ll ans=st;
ll minn=maxn;
ll mm=0;
for(int i=1;i<=n;i++)
{
if(a[i]-1+k>ed||ans+k>ed)
{
break;
}
if(minn>max(0LL,ans-a[i]+1))
{
minn=max(0LL,ans-a[i]+1);
mm=a[i]-1;
}
ans=max(ans,a[i])+k;
}
if(ans+k>ed)
{
printf("%lld\n",mm);
}
else
{
printf("%lld\n",ans);
}
return 0;
}
本文介绍了一种通过模拟算法确定个体在限定时间内到达并完成业务办理的最佳时机的方法。考虑到排队人员的具体到达时间及业务办理时间,算法寻找等待时间最短的到达时刻。
717

被折叠的 条评论
为什么被折叠?



