题解 | #活动安排#

活动安排

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); // 输出可选择的活动数量
    }
}

贪心策略

  1. 选择结束时间最早的活动:每次选择结束时间最早的活动,可以留出更多时间给后续的活动。
  2. 活动排序:先根据结束时间 b_i 对所有活动进行排序。
  3. 选择活动:遍历排序后的活动,如果当前活动的开始时间 a_i 大于或等于已选择活动的结束时间,则选择这个活动。

贪心策略,每次选择结束时间最早的活动,那么前提对所有活动的结束时间进行从小到大排列,当活动开始时间大于前面的活动结束时间,就选择,然后继续下一个。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务