题目描述:
在某个项目中有多个任务(用 tasks 数组表示)需要您进行处理,其中 t a s k s [ i ] = [ s i , e i ] tasks[i] = [si, ei] tasks[i]=[si,ei],你可以在 s i < = d a y < = e i si <= day <= ei si<=day<=ei 中的任意一天处理该任务。请返回你可以处理的最大任务数。
注:一天可以完成一个任务的处理。
输入描述:
第一行为任务数量 n , 1 < = n < = 100000 n,1 <= n <= 100000 n,1<=n<=100000。后面 n 行表示各个任务的开始时间和终止时间,用 si 和 ei 表示, 1 < = s i < = e i < = 100000 1 <= si <= ei <= 100000 1<=si<=ei<=100000。
输出描述:
输出为一个整数,表示可以处理的最大任务数。
补充说明:
示例1
输入:
3
1 1
1 2
1 3
输出:
3
说明:
第一天处理任务 1,第二天处理任务 2,第三天处理任务 3。
题解
贪心算法,优先处理最早结束的任务,留下更多的时间处理其他任务
源码 Java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class MaxTask {static Input input;static {input = new Input("3\n" +"1 1\n" +"1 2\n" +"1 3");}public static void main(String[] args) {int n = Integer.parseInt(input.nextLine());List<Task> tasks = new ArrayList<>();for (int i = 0; i < n; i++ ) {String[] ss = input.nextLine().split(" ");tasks.add(new Task(Integer.parseInt(ss[0]), Integer.parseInt(ss[1])));}Collections.sort(tasks);int max = 0;int time = 0;for (int i = 0; i < tasks.size(); i++) {// 任务开始前空闲一定可以做if (time <= tasks.get(i).start) {time = tasks.get(i).start + 1;max++;} else if (time <= tasks.get(i).end) {// 任务开始后 到结束时间有空闲, 该任务可以做time++;max++;}}System.out.println(max);}static class Task implements Comparable<Task>{int start;int end;public Task(int start, int end) {this.start = start;this.end = end;}public int compareTo(Task o ) {return this.end - o.end;}}
}