首页 > 其他 > 详细

【枚举】【贪心】 Codeforces Round #398 (Div. 2) B. The Queue

时间:2017-02-19 00:22:30      阅读:273      评论:0      收藏:0      [点我收藏+]

卡题意……妈的智障

一个人的服务时间完整包含在整个工作时间以内。

显然,如果有空档的时间,并且能再下班之前完结,那么直接输出即可,显然取最左侧的空档最优。

如果没有的话,就要考虑“挤掉”某个人,就是在某个人之前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\n",ts+(ll)sum*t);
	  	  	return 0;
	  	  }
	  	sum+=num[i];
	  }
	if(ts+(ll)(sum+1)*t<=tf)
	  {
	  	printf("%I64d\n",ts+(ll)sum*t);
	  	return 0;
	  }
	printf("%I64d\n",ans);
	return 0;
}

【枚举】【贪心】 Codeforces Round #398 (Div. 2) B. The Queue

原文:http://www.cnblogs.com/autsky-jadek/p/6414454.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!