Java- 活动安排(贪心算法)

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java- 活动安排(贪心算法)相关的知识,希望对你有一定的参考价值。

题目描述

有n份兼职,每份兼职有一个开始时间和一个结束时间,假设你的空闲时间为从1到m,假如你的休息时间可以忽略,
请你选择若干份兼职(每次只能做其中一个兼职),使你在该段空闲时间内完成的兼职份数最大。

输入:第一行为两个整数n,m分别表示n份兼职,空闲时间为1到m(1<=n<=1e4,1<=m<=1e5)。
接下来n行每行有2个整数a,b。表示该兼职开始和结束时间(1<=a<=b<=m)。

输出:输出你在1到m时间段内最多能完成几份兼职。

算法分析

如何选择,才是贪心的最优解

  • 将原数据,按照开始时间排序
  • 将原数据,按照结束时间排序
  • 将原数据,按照完成最短时间排序

直观发现只有按照结束时间排序才是最佳选择,其他两种都有直观的反例,由于能力欠缺 具体证明 不再详述。致歉

代码展示

仅供参考

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;
 
 
public class Main {
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
     
    public static void main(String[] args) {
        int n = nextInt();
        int m = nextInt();
        int[][] A = new int[n][2];  // A[i][0]代表活动i的开始时间,A[i][1]代表结束时间
        
        for (int i = 0; i < n; i++) {
            A[i][0] = nextInt();
            A[i][1] = nextInt();
        }
        // 重写比较器,按照结束时间升序
        Arrays.sort(A, new Comparator<int []>() {
             public int compare(int[] a, int[] b) {
                return a[1] - b[1];
            }
        });
       
        int cnt = 1;  // 活动数
        int j = 0;  // 当前活动的 下标
        // 当下一个活动
        for (int i = 1; i < n; i++) {
            if (A[i][0] >= A[j][1]) {
                cnt++;
                j = i;
            }
        }
        System.out.println(cnt);
         
    }
     
    static int nextInt() {
        try {
            in.nextToken();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (int)in.nval;
    }
}

感谢努力
加油!

以上是关于Java- 活动安排(贪心算法)的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法-第一节:贪心算法概述

算法笔记(0002) - 贪心算法活动安排问题

算法设计与分析贪心算法--活动安排问题

活动安排问题-贪心算法

活动安排问题-贪心算法

贪心算法之活动选择问题