根据来宾人数的最大数量合并重叠间隔

时间:2019-05-18 07:33:52

标签: c# algorithm merge intervals overlap

我想制作一个程序,计算一次同时有多少位客人。所有客人都有到达和离开的时间。我已经计算出最大的客人人数,它可以给我一次达到最大人数的机会。我想要的是出现最大人数时的所有时间间隔

我试图用一种重叠的方法来做到这一点,但是它并不是很有效,可能是因为它比较了列表中太多或太少的值。我有两个列表,到达和退出,在将它们写在控制台应用程序上时在其中添加值。

我尝试将来自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在列表中出现多次),这给了我太多的时间间隔。

1 个答案:

答案 0 :(得分:1)

制作数组或结构列表,其中包含所有来宾的到达和离开时间,以及+1/-1标志,指示事件的类型(到达为+1)。

按时间排序列表字段。如果首先要进行平局到达事件,那么如果您想以零间隔注册两名客人(一个进入,另一个同时退出),否则首先离开,这似乎是您的情况。

制作Count = 0MaxCount

浏览列表,将标志字段添加到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