我想制作一个程序,计算一次同时有多少位客人。所有客人都有到达和离开的时间。我已经计算出最大的客人人数,它可以给我一次达到最大人数的机会。我想要的是出现最大人数时的所有时间间隔
我试图用一种重叠的方法来做到这一点,但是它并不是很有效,可能是因为它比较了列表中太多或太少的值。我有两个列表,到达和退出,在将它们写在控制台应用程序上时在其中添加值。
我尝试将来自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在列表中出现多次),这给了我太多的时间间隔。
答案 0 :(得分:1)
制作数组或结构列表,其中包含所有来宾的到达和离开时间,以及+1/-1
标志,指示事件的类型(到达为+1)。
按时间排序列表字段。如果首先要进行平局到达事件,那么如果您想以零间隔注册两名客人(一个进入,另一个同时退出),否则首先离开,这似乎是您的情况。
制作Count = 0
和MaxCount
。
浏览列表,将标志字段添加到Count
。
每个事件后的Count
值表示房间中的任务数量。
Guests (12,30), (18,25), (25,40), (13,15) and (32,36)
Events 12;1 13;1 15;-1 18;1 25;-1 25;1 30;-1 32;1 36;-1 40;-1
Count 0 1 2 1 2 1 2 1 2 1 0
^ x ^ x ^ x ^ x
Max intervals (^-x)
当Count
达到MaxCount
时-开始新的输出间隔,当它变为MaxCount - 1
-完成该间隔并将其添加到OutList
当Count
超过MaxCount
时-清除OutList
,进行MaxCount - Count
并开始新的输出间隔
最终输出MaxCount
和间隔OutList