题解 | #活动安排#
活动安排
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
大于或等于已选择活动的结束时间,则选择这个活动。
贪心策略,每次选择结束时间最早的活动,那么前提对所有活动的结束时间进行从小到大排列,当活动开始时间大于前面的活动结束时间,就选择,然后继续下一个。