Algorithm 如何将K个学生的队列与N个考官匹配

Algorithm 如何将K个学生的队列与N个考官匹配,algorithm,Algorithm,假设我们有N名考官和一队k名学生。每个考官检查学生所需的时间存储在[i]中。 我们的任务是找出检查所有学生和将检查队列中最后一名学生的考官所需的总时间。每个考官一次只能检查一名学生。附加限制:如果一名学生没有占用超过一名考官的时间,下一名学生将前往第一名可能的考官(参见示例的步骤4) 举一个例子,如果我们有N=2名考官,k=4名学生,第一名考官需要每个学生10分钟(A[1]=10),第二名考官需要每个学生5分钟(A[2]=5),那么: 步骤1:学生1在时间0到达考官1 第2步:学生2也在时间0到

假设我们有N名考官和一队k名学生。每个考官检查学生所需的时间存储在[i]中。 我们的任务是找出检查所有学生和将检查队列中最后一名学生的考官所需的总时间。每个考官一次只能检查一名学生。附加限制:如果一名学生没有占用超过一名考官的时间,下一名学生将前往第一名可能的考官(参见示例的步骤4)

举一个例子,如果我们有N=2名考官,k=4名学生,第一名考官需要每个学生10分钟(A[1]=10),第二名考官需要每个学生5分钟(A[2]=5),那么:

步骤1:学生1在时间0到达考官1

第2步:学生2也在时间0到达考官2

第三步:学生3在时间5到达考官2,因为学生2已经完成

第四步:学生4可以在时间10时前往考官1或考官2,因为两者都已完成。由于我们的附加限制,他前往考官1

第五步:学生4在时间20结束

因此程序应该作为输出返回:time=20,examiner=1

到目前为止,我想到了一个O(nk)算法:

if(n>=k)  //if examiners more than students ,it's simple
{
for(i=1;i<=k;i++)
B[i]=A[i];
p=max_position(B);  //find maximum of first k elements
printf("%d,B[p]);   //required time
return(k);  //kth student goes to kth examiner
}
else
{
for(i=1;i<=n;i++)
B[i]=A[i];    //create copy of A
int t=0;
for(i=1;i<=k-n;i++)  //n students already gone to examiners in time 0
{
int p = min_position(B);  //finds position of minimum element
B[p]=B[p]+A[p];
time = B[p];
}
printf("%d ,time);
return(p);
}
if(n>=k)//如果考官比学生多,这很简单
{

对于(i=1;i,您可以随时以以下方式向所有考官创建订单:

  • 提前可用的考官比晚可用的考官“小”(这可以表示为考官空闲的时间)

  • 如果两名考官同时可用,则索引较小的考官为“较小”

  • 使用此顺序,您可以构建一个存储所有考官的最小堆,并为每个学生将考官拉到堆的顶部(最小的),然后将其插入到堆中,添加进行考试所需的时间

    此解决方案将在O(klogn)中运行