搜索 值班警卫

来源:互联网 发布:守望先锋技能数据 编辑:程序博客网 时间:2024/04/30 04:34

对于每一个值班警卫,都有开始值班的时间以及值班时间;给出n个警卫的值班时间表,求在一段时间内,是否每个时间点都有超过两个警卫值班?如果没有,那么是否可以通过对警卫的值班起始时间进行调整,是之符合要求?如果可以,那么求调动警卫数最小的方案。


这个问题中,比较麻烦的就是后两个;需要用到搜索;


搜索啊搜索,这道题耽误了好久,就是搜索的地方没有完全想通。。。


其实关键就是:确定一种搜索方案,将每个警卫的搜索的调动的起始时间都定为0;从一个警卫开始,选用一种调动的起始时间;在这个时间的基础上,调整下个警卫的值班时间,直到所有的警卫调整完毕为止(当然,时间的调整与方案有关,不是每个警卫的起始时间都需要调整)。如果最终能够使时间段上都存在两个警卫,那么这就是一种方案;

不论有无方案,都从最后一个警卫回溯到之前的警卫,换成另外的时间调动,继续向下。这里要注意的是:如果在当前的警卫时,从之前的警卫下来的调整的警卫数加上当前要调整的不小于当前警卫调整的数目,那么,这一种时间的调整方案就不需要再向下考虑了,需要再换一种方案。


这样,直到所有的方案都考虑到为止,求出最少的警卫调整数。


搜索方案:

start[i]为第i个警卫的值班的原始的起始时间

a[i].t1为调整的第i个警卫的时间,初始值为0

1. 当start[i]>a[i].ti时,在[a[i],t1 , start[i]]这段时间内,都为两个以上警卫值班,那么将a[i].t1移动到这个警卫的值班为止的时间到这段时间的末尾;

如果有不是两个或以上的,那么将a[i].t1移到出现不是两个的时间段上。

2. 1步骤执行完后,start[i]<a[i].t1 ,在[start[i] , a[i].t] 中如果存在不是两个警卫都值班,则将a[i].t1向前移到,使该警卫的值班结束时间到不是两个或以上的值班的时间段处;

如果都有两个警卫值班,那么使a[i].t1=start[i];


以上即是该种问题的方案:)

原创粉丝点击