题解 | #活动安排#
活动安排
https://www.nowcoder.com/practice/16d971e9e42e4f3b9b1e2b8794796a43
import java.util.Scanner;
//# 贪心策略是每次取结束时间最小的,题目本身保证了开始时间一定小于结束时间,根据结束时间从小到大排序,遍历时每次记录上一次的结束时间,当本次开始时间大于等于上次结束时间时,就把它算进去
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 读取活动数量
int[][] activities = new int[n][2];
// 读取每个活动的时间
for (int i = 0; i < n; i++) {
activities[i][0] = scanner.nextInt(); // a_i
activities[i][1] = scanner.nextInt(); // b_i
}
// 按结束时间排序
Arrays.sort(activities, Comparator.comparingInt(a -> a[1]));
int count = 0; // 选择的活动数量
int lastEndTime = 0; // 上一个选择活动的结束时间
// 遍历活动
for (int i = 0; i < n; i++) {
if (activities[i][0] >= lastEndTime) { // 如果当前活动可以选择
count++; // 选择当前活动
lastEndTime = activities[i][1]; // 更新结束时间
}
}
System.out.println(count); // 输出可选择的活动数量
}
}
贪心策略
- 选择结束时间最早的活动:每次选择结束时间最早的活动,可以留出更多时间给后续的活动。
- 活动排序:先根据结束时间
b_i对所有活动进行排序。 - 选择活动:遍历排序后的活动,如果当前活动的开始时间
a_i大于或等于已选择活动的结束时间,则选择这个活动。
贪心策略,每次选择结束时间最早的活动,那么前提对所有活动的结束时间进行从小到大排列,当活动开始时间大于前面的活动结束时间,就选择,然后继续下一个。
小天才公司福利 1193人发布