卡题意……妈的智障
一个人的服务时间完整包含在整个工作时间以内。
显然,如果有空档的时间,并且能再下班之前完结,那么直接输出即可,显然取最左侧的空档最优。
如果没有的话,就要考虑“挤掉”某个人,就是在某个人之前1分钟到达,这样显然比较优。
就这些情况都考虑上就得了。
#include<cstdio> using namespace std; typedef long long ll; ll ts,tf,t,a[100010],b[100010],wait=10000000000000ll,ans; int n,num[100010],m; int main() { // freopen("b.in","r",stdin); scanf("%I64d%I64d%I64d%d",&ts,&tf,&t,&n); for(int i=1;i<=n;++i) scanf("%I64d",&a[i]); for(int i=1;i<=n;++i) if(a[i]!=a[i-1]) { b[++m]=a[i]; num[m]=1; } else ++num[m]; int sum=0; for(int i=1;i<=m;++i) if(b[i]<tf) { if(ts+(ll)(sum+1)*t<=tf && ts+(ll)sum*t-(b[i]-1ll)<wait) { wait=ts+(ll)sum*t-(b[i]-1ll); ans=b[i]-1ll; } if(ts+(ll)(sum+1)*t<=tf && b[i]-ts>(ll)sum*t) { printf("%I64d ",ts+(ll)sum*t); return 0; } sum+=num[i]; } if(ts+(ll)(sum+1)*t<=tf) { printf("%I64d ",ts+(ll)sum*t); return 0; } printf("%I64d ",ans); return 0; }