我有以下问题:给定一个时间间隔的列表和一个整数
k
,是否存在将值<= k
分配给时间间隔的方案,使得没有两个重叠的时间间隔具有相同的值?是否存在一种多项式算法来解决这个问题?我认为可以用动态规划来解决,但我想不出解决方案。k
,是否存在将值<= k
分配给时间间隔的方案,使得没有两个重叠的时间间隔具有相同的值?是否存在一种多项式算法来解决这个问题?我认为可以用动态规划来解决,但我想不出解决方案。k
台机器和一堆任务(时间间隔)即将到来,每个任务都有一个开始和结束时间。每个任务将占用一台机器的时间间隔。你想知道是否能处理所有的任务。你的问题等同于在O(nlogn)
时间内找到最大数量的相交区间。
证明:假设对于一组区间S
,k
是从S
中相交区间的最大数量。显然,为了进行有效分配,我们必须至少使用k
个数字。现在我们需要证明k
是足够的。让我们按升序迭代S
中的区间。每次打开一个新的区间时,我们从未使用过的数字集合中选择一个数字,每次关闭一个区间时,我们将数字放回该集合。显然,k
个数字的集合就足够了。
相应的 C++ 代码:
bool canAssign(const std::vector<std::pair<int, int>> &intervals, int k)
{
const int left = 0, right = 1;
std::vector<std::pair<int, int>> ends;
for (const auto &interval: intervals)
{
ends.emplace_back(interval.first, left);
ends.emplace_back(interval.second, right);
}
std::sort(ends.begin(), ends.end());
int maxStack = 0, stack = 0;
for (const auto &end: ends)
{
if (end.second == left)
++stack;
else
--stack;
maxStack = std::max(maxStack, stack);
}
return maxStack <= k;
}
k
-着色的问题。虽然我对这个主题不太了解,但这些概念是算法文献中提到该问题时所使用的。 - CodorO(nlogn)
时间复杂度内找到最大数量的相交区间。 - piotrekg2