有一个聚会。有一个日志记录,其中记录了所有客人的进入和退出时间。你必须告诉聚会中有最大客人的时间。 输入将是所有n位客人的进入和退出时间[1,4] [2,5] [9,12] [5,9] [5,12] 输出将是t = 5,因为最多有3位客人,其中有一位客人(从1开始)2,4和5。
我到目前为止尝试的是
main()
{
int ret;
int a[5]={1,2,9,5,5};
int b[5]={4,6,12,9,12};
int i,j;
int runs=5;
int cur = 0,p1 = 0,p2 = 0;
printf("input is ");
for(i=0;i<5;i++)
{
printf("(");
printf("%d,%d",a[i],b[i]);
printf(")");
}
while(runs--)
{
while(p1<5 && p2<5)
{
if(a[p1] <= b[p2])
{
cur ++;
p1 ++ ;
}
else {
cur --;
p2 ++ ;
}
ret = cur ;
}
}
printf("\n the output is %d",ret);
}
我得到3作为输出......这是完全错误的!我在哪里犯错?
答案 0 :(得分:1)
您正在打印索引而不是实际时间。尝试打印已修改 p1[ret]
a[ret]
。
答案 1 :(得分:1)
您的代码有几个问题。这里有一些关于改进它的地方的一些指示:
您的算法本身值得怀疑。假设您的第一位客人是派对主持人并从1开始一直待到派对结束时间。使用您当前的代码,p2
将永远不会更改,您将忽略所有其他客人的请假时间。
即使您的算法有效,也会假设您的输入已排序。通过迭代p1
/ p2
,您隐式假设数组中的增长时间,这对于您的示例输入已经是错误的。所以你应该先对输入进行排序。
您在主循环的每次迭代中分配结果ret
。这忽略了当前状态(cur
)是否是最大客人数的事实。提示:如果哟要计算某些内容的最大值并且代码中没有任何最大计算量,则可能会遗漏某些内容。
这是一个不同的想法:假设你可以节省maxtime数组的数组,创建一个填充0的数组。如果客人到达,则通过在特定时间递增数组来处理您的输入,并在客户离开时递减它。例如,前5分钟看起来像[1, 1, 0, -1, 1, ...]
。然后,线性地遍历数组并计算最大前缀和更简单。以这种方式计算这个最大客人数存在的时间间隔也更加容易。
(如果你想要更加花哨并且有更大的总时间间隔来覆盖,而是依赖于带有时间作为键的地图。像数组一样初始化,然后按排序顺序处理键。)