题目链接:
描述
大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。
输入
多组数据。每组数据开头是n(n<=100),表示共n场电影。
接下来n行,每行两个整数(0到1000之间),表示一场电影的放映区间
n=0则数据结束
输出
对每组数据输出最多能看几部电影
样例输入
8 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 0
样例输出
3
解题分析:
本题采用贪心算法:
首先对输入的数据按照结束时间从小到大排序,然后进行贪心选择。
解题代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (true) {
int n = input.nextInt();
int length = n;
if (n == 0)
break;
int[] starts = new int[n];
int[] ends = new int[n];
while (n > 0) {
n--;
int start = input.nextInt();
int end = input.nextInt();
starts[n] = start;
ends[n] = end;
}
// 按照结束时间从早到晚排序
for (int i = length - 1; i > 0; i--) {
for (int j = i; j >= 0; j--) {
if (ends[i] < ends[j]) {
// 交换
int tempStart = starts[i];
starts[i] = starts[j];
starts[j] = tempStart;
int tempEnd = ends[i];
ends[i] = ends[j];
ends[j] = tempEnd;
}
}
}
// 开始贪心
int tmpStart = 0;
int index = 0;
int count = 0;
while (index < length) {
if (starts[index] >= tmpStart) {
count++;
tmpStart = ends[index];
}
index++;
}
System.out.println(count);
}
}
}
结果: Accepted