HDU 6180
题目
给你 n n n 个任务, 每个任务都有一个开始结束时间, 你有很多机器, 每个机器同一时刻只能执行一个任务, 问你最少需要几台机器才能完成所有任务, 并且这些机器总共的运行时间总和的最小值是多少. (机器一旦开始使用, 知道最后完成所有任务, 中途不能关机)
思路
二分会 TLE.
将每个任务拆成两个数据: 开始时间和结束时间, 因此一共有 2 n 2n 2n 个时间点, 然后将它们排序 (时间相同, 结束的优先级更高).
遍历这些时间点, 每遇到一个任务开始的时间点, 机器数加一, 每遇到一个结束的时间点, 机器数减一, 整个过程中机器数的最大值为最少需要的机器数.
总运行时间等于所有任务的时间加所有机器的待机时间, 前者在处理输入时累加得到, 后者的计算方法是: 维护一个栈, 每遇到一个任务结束的时间点, 该时间点入栈, 没遇到一个任务开始的时间点, (如果此时栈空说明需要一个新机器), 时间点出栈, 此时的时间点便是离任务最近的机器, 二者之差即为该次任务所产生的待机时间.
这个算法很美啊…
代码 ( C语言 )
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int type; // 0-> start; 1-> end
int time;
} Task;
int compare(const void* a, cons