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
Hint
完整代码
#include<iostream>
#include<algorithm>
using namespace std;
class Task
{
public:
long long start, end;
Task():start(0),end(0){}
};
class Machine
{
public:
long long start, end;
Machine() :start(0), end(0){}
};
bool cmp(Task a, Task b){ return a.start < b.start; }
bool cmp2(Machine a, Machine b){ return a.end > b.end; }
int main()
{
int t;cin >> t;
while (t--)
{
int n;cin >> n;
Task* task = new Task[n];
for (int i = 0;i < n;i++)
cin >> task[i].start >> task[i].end;
sort(task, task + n, cmp);
int total = 0;
Machine* machine = new Machine[n];
for (int i = 0;i < n;++i)
{
int flag = 0;
for (int j = 0;j < total;++j)
if (machine[j].end <= task[i].start)
{
flag = 1;
machine[j].end = task[i].end;
break;
}
if (!flag)
{
total++;
machine[total - 1].start = task[i].start;
machine[total - 1].end = task[i].end;
}
sort(machine, machine + total, cmp2);
}
long long time = 0;
for (int i = 0;i < n;i++)
time += (machine[i].end - machine[i].start);
cout << total << " " << time <<endl;
}
}