称号:
天。至N一个采访,他们的时间为[B[i], E[i]]。分别比结束采访时面试的开始时间。此N在多个采访点的面试安排。不同的采访在同一时间,不能安排在同一个采访点。
现在,它需要如何,至少许多采访得点。
分析思路:
通过贪心算法来解决。算法的思路是:对于全部的面试I[i] = [B[i], E[i]]。按B[i]从小到大排序,然后按顺序对各个区间着色。
对当前区间i着色时,必须保证所着的颜色(color[i])没有被出如今这个区域之前且时间段与当前区间有重叠的区间用到。
如果面试的总数为N。那么代码例如以下:
int nMaxColor = 0, k = 0; bool isForbidden[NMAX]; for(int i = 0; i < n; ++i) { for(k = 0; k < nMaxColor; ++k) isForbidden[k] = false; for(int j = 0; j < i; ++j) if(Overlap(b[j], e[j], b[i], e[i])) isForbidden[color[j]] = true; for(k = 0; k < nMaxColor; ++k) if(!isForbidden[k]) break; if(k < nMaxColor) color[i] = k; else color[i] = nMaxColor++; }
上述代码中nMaxColor就是最后返回的所需的最少颜色。
isForbidden是对于每一个时间区间i,其它时间区间j中開始时间位于这个时间区间之前的且与这个时间区间有重叠的面试所占用的颜色的标识数组。
Overlap函数,则是用来推断两个时间区间是否有重叠。
另一种更简单的思路:
我们要得到的是最少所需的颜色数
仍然先对面试数组排序, 然后遍历面试数组, 每遇到一个 B, color +1, 并维护全局最大 color 数。 每遇到一个 E, color 数减一. 返回全局最大 color 值
代码例如以下:
int nColorUsing = 0, nMaxColor = 0; for(int i = 0; i < 2 * n; ++i) { if(TimePoints[i].type == "Begin") { nColorUsing++; if(nColorUsing > nMaxColor) nMaxColor = nColorUsing; }else nColorUsing--; }
版权声明:本文博客原创文章。博客,未经同意,不得转载。