输入包含一组以开始时间从小到大的顺序给出的任务,并且每个任务都有一定的持续时间。 第一行是任务数,例如
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个数字:
[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);
}
可以使用实现为堆的优先级队列来做到这一点吗?
答案 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
来存储结构,而不是普通数组。这样一来,您也将避免动态分配内存,因为向量会自动为您处理。