【发布时间】:2019-05-18 07:33:52
【问题描述】:
我想制作一个程序来计算有多少客人同时在场。所有客人都有到达和离开时间。我已经计算了最多客人数,它可以给我一次,当它达到最大值时。我想要的是出现最大客人数的所有时间间隔
我尝试过使用重叠方法,但效果不佳,可能是因为它比较了列表中太多或太少的值。我有两个列表,到达和退出,我在控制台应用程序上写入值时添加值。
我尝试将来自 time 和 time2 的时间添加到一个列表中并对其进行排序,但它为某些测试输入添加了太多值。
int max = 1; int count = 1;
int i = 1; int j = 0;
long time = arrival[0]; long time2= dep[0];
while (i < n1 && j < n1) // n1 is the length of the input integer
{
if (arrival[i] < dep[j])
{
count++;
if (count >= max)
{
max = count;
time = arrival[i];
time2= dep[j];
}
// possible location of console.writeline(time1 + time2)
// somewhere here I would add time and time2 to a new list
i++;
}
else
{
count--;
j++;
}
} Console.WriteLine(max); Console.WriteLine(time1 + " " + time2);
假设我的输入是 5 位客人,间隔:(12,30)、(18,25)、(25,40)、(13,15) 和 (32,36) 想要的结果是
2 // 当时最多客人
13 15 // 每个间隔换行
18 30
32 36
但我无法让它工作,它只显示 32-36。如果我将 console.writeline 放在可能的位置,它会给我:13-15、18-25、25-30、32-36。对于具有更多重复项的其他测试输入(例如 0 到 5 在列表中多次出现),它给了我太多的间隔。
【问题讨论】:
-
请指定时间间隔范围以及您有多少客人。
-
您有一种称为电话中继线问题的问题,即根据呼叫的峰值数量确定公司所需的中继线数量。多年前,贝尔实验室的计算机科学家致力于解决方案。解决方案是首先为正在使用的时间段创建一个包含 5 分钟时间段的表格。然后通过将呼叫开始的时间段和每 5 分钟的时间段加 1 来处理每个呼叫,直到被呼叫结束。那么调用的峰值数就是表中最高的数。
-
n 个小于 1000000 的客人,时间间隔在 0 秒到 3000000 之间。每个时间间隔都有自己的范围,但可以与其他客人相同。没有设定范围,可以停留 1 秒或 10 秒等。
-
这将受益于定义一个函数而不是编写控制台代码。输入可以是到达/离开对和特定时间的列表。查看该函数并查看它的输入和输出将更容易理解问题。即使该函数是空的,它也可以让您更轻松地查看正在发生的事情以及您期望返回的内容。
-
@jdweng 你的评论还指什么?
标签: c# algorithm merge intervals overlap