Description
多个调度任务,给出调度任务的起始时间和结束时间,问至少需要多少个设备能完成调度任务,在保证最小设备的情况,要求所有设备运行总时长最短。
每个设备的运行时长:从给这个设备的第一个任务开始计算到这个设备的最后一个任务结束,中间哪怕没有任务也要计算运行时长。
Input
输入的第一行包含一个正整数t(t ≤ 100),代表共有t组输入实例。每组输入实例中,第一行包含一个正整数n(n ≤ 100),接下来输入n行,每一行包含两个正整数l和r(0 ≤ l < r ≤ 109),分别一个调度任务的开始时间和结束时间l,r。读入至文件结束为止。
Output
每组实例输出两个正整数,分别代表使用设备的数量,设备运行的总时长,每组实例输出占一行
Sample Input
1
5
1 3
3 6
2 4
5 7
6 9
Sample Output
2 13
思路——如何让设备最少和时间最短
1.把任务开始时间从小到大排序
2.对所有任务进行一次遍历,查询此时是否有设备可以提供服务,没有设备则创建一个设备,有设备则从所有空闲设备中查找一个设备的结束时间与此任务的开始时间最短的进行服务
记录设备的数量以及开始结束时间,最后输出
#include
#include <iostream>
#include<limits.h>
#include <vector>
using namespace std;
class mission { //任务类
public:
long long start;
long long end;
};
class machine { //设备
public:
long long start;
long long end;
};
int cmp(const mission &a, const mission &b) {
return a.start < b.start;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
scanf("%d", &n);
mission a[n];
for (int i = 0; i < n; i++) {
cin >> a[i].start >> a[i].end;
}
sort(a, a + n, cmp); //根据任务开始时间从小到大排序
vector<machine> b;
long long machine_time = 0; // 设备工作总时间
machine m1; //至少需要一台设备,所以先创建
m1.start = a[0].start;
m1.end = a[0].end;
b.push_back(m1); //加入设备数组中
for (int i = 1; i < n; i++) {
int flag = 1; // 判断该任务是否被已有的设备运行
long long min = INT_MAX;
int index = 0; //记录任务结束时间与设备结束时间最小值的设备下标
for (int j = 0; j < b.size(); j++) {
if (b[j].end > a[i].start) //说明该设备无法调度该进程,查询下一个设备
;
else { //找到空闲时间最小的设备下标
int temp = a[i].start - b[j].end;
if(temp < min) {
min = temp;
index = j;
}
flag = 0; //说明至少有一个设备可以运行该任务
}
}
if(flag) { //找不到设备运行,创建一个新设备
machine m2;
m2.start = a[i].start;
m2.end = a[i].end;
b.push_back(m2);
} else {
b[index].end = a[i].end;
}
}
for (int i = 0; i < b.size(); i++) {
machine_time += (b[i].end - b[i].start);
}
cout << b.size() << " " << machine_time << "\n";
}
return 0;
}