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- 活动安排(贪心算法)的主要内容,如果未能解决你的问题,请参考以下文章