在C ++中使用开始时间和持续时间对活动任务进行计数

时间:2018-09-16 11:59:30

标签: c++ heap priority-queue event-driven

输入包含一组以开始时间从小到大的顺序给出的任务,并且每个任务都有一定的持续时间。 第一行是任务数,例如

3
2 5
4 23
7 4

这意味着有3个任务。第一个开始于时间2,结束于7(2 + 5)。第二个开始于4,结束于27。第三个开始于7,结束于11。 我们假定每个任务在准备就绪后立即开始,并且不需要等待处理器或其他任何东西释放。 这意味着我们可以跟踪活动任务的数量:

Time       #tasks
0 - 2        0
2 - 4        1
4 - 11       2
11 - 27      1

我需要找到2个数字:

  1. 在任何给定时间(本例中为2)的最大活动任务数,并且
  2. 在整个持续时间内活动任务的平均数量,计算如下:

[0 *(2-0)+ 1 *(4-2)+ 2 *(11-4)+ 1 *(27-11)] / 27

为此, 我首先使用以下代码找到了所有任务结束的时间:

#include "stdio.h"
#include "stdlib.h"

typedef struct
{
    long int start;
    int dur;
} task;

int main()
{
    long int num_tasks, endtime;
    long int maxtime = 0;
    scanf("%ld",&num_tasks);
    task *t = new task[num_tasks];
    for (int i=0;i<num_tasks;i++)
    {
        scanf("%ld %d",&t[i].start,&t[i].dur);
        endtime = t[i].start + t[i].dur;
        if (endtime > maxtime)
            maxtime = endtime;
    }
    printf("%ld\n",maxtime);
}

可以使用实现为堆的优先级队列来做到这一点吗?

1 个答案:

答案 0 :(得分:0)

您的问题涉及面很广,所以我只给您一个预告片答案,希望可以帮助您入门,尝试用不一定优化的解决方案来回答问题的第一部分。

在玩具输入中,您具有:

2 5
4 23
7 4

因此,您可以计算任务的结束时间而不是持续时间,并将其存储在结构数组中,以备后用。这样给出的数组如下:

2 7
4 27
7 11

您的数组已经按照开始时间进行了排序(因为输入是按该顺序给出的),这很有用。如果需要,请使用std::sort对数组进行排序。

观察如何检查第一个任务的结束时间和其他任务的开始时间。通过正确的比较,您可以确定活动任务的数量以及第一个任务。如果检查第一个任务的结束时间是否大于第二个任务的开始时间(如果为true),则表示这两个任务在某个时刻同时处于活动状态。

然后,您将对第一项任务和第三项任务进行比较。之后,您将知道与第一个任务相关的活动任务有多少。

然后,您将按照相同的步骤执行第二个任务,依此类推。

将所有内容放到代码中,我们得到:

#include "stdio.h"
#include "stdlib.h"
#include <algorithm>

typedef struct {
    int start;
    int dur;
    int end;
} task;

int compare (const task& a, const task& b) {
    return ( a.start < b.start );
}

int main() {
    int num_tasks;
    scanf("%d",&num_tasks);
    task *t = new task[num_tasks];
    for (int i=0;i<num_tasks;i++) {
        scanf("%d %d",&t[i].start,&t[i].dur);
        t[i].end = t[i].start + t[i].dur;
    }
    std::sort(t, t + num_tasks, compare);
    for (int i=0;i<num_tasks;i++) {
        printf("%d %d\n", t[i].start, t[i].end); 
    }
    int max_noOf_tasks = 0;
    for(int i = 0; i < num_tasks - 1; i++) {
        int noOf_tasks = 1;
        for(int j = i + 1; j < num_tasks; j++) {
            if(t[i].end > t[j].start)
                noOf_tasks++;
        }
        if(max_noOf_tasks < noOf_tasks)
            max_noOf_tasks = noOf_tasks;
    }
    printf("Max. number of active tasks: %d\n", max_noOf_tasks);
    delete [] t;
}

输出:

2 7
4 27
7 11
Max. number of active tasks: 2

现在,祝您第二部分问题好运。


PS:由于这是C ++,因此您可以使用std::vector来存储结构,而不是普通数组。这样一来,您也将避免动态分配内存,因为向量会自动为您处理。