党日志登记问题

时间:2011-08-22 05:21:24

标签: c

有一个聚会。有一个日志记录,其中记录了所有客人的进入和退出时间。你必须告诉聚会中有最大客人的时间。 输入将是所有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作为输出......这是完全错误的!我在哪里犯错?

2 个答案:

答案 0 :(得分:1)

您正在打印索引而不是实际时间。尝试打印已修改 p1[ret] a[ret]

答案 1 :(得分:1)

您的代码有几个问题。这里有一些关于改进它的地方的一些指示:

  • 您的算法本身值得怀疑。假设您的第一位客人是派对主持人并从1开始一直待到派对结束时间。使用您当前的代码,p2将永远不会更改,您将忽略所有其他客人的请假时间。

  • 即使您的算法有效,也会假设您的输入已排序。通过迭代p1 / p2,您隐式假设数组中的增长时间,这对于您的示例输入已经是错误的。所以你应该先对输入进行排序。

  • 您在主循环的每次迭代中分配结果ret。这忽略了当前状态(cur)是否是最大客人数的事实。提示:如果哟要计算某些内容的最大值并且代码中没有任何最大计算量,则可能会遗漏某些内容。

这是一个不同的想法:假设你可以节省maxtime数组的数组,创建一个填充0的数组。如果客人到达,则通过在特定时间递增数组来处理您的输入,并在客户离开时递减它。例如,前5分钟看起来像[1, 1, 0, -1, 1, ...]。然后,线性地遍历数组并计算最大前缀和更简单。以这种方式计算这个最大客人数存在的时间间隔也更加容易。

(如果你想要更加花哨并且有更大的总时间间隔来覆盖,而是依赖于带有时间作为键的地图。像数组一样初始化,然后按排序顺序处理键。)