题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037
题目要求:
如何合理安排看尽量多的完整节目?
image.png
做题思路:
该题的目的是将列表的节目尽可能多地完整地看一遍,于是就可以用贪心算法------区间调度------来求解.
我们将电视节目分为12个区间,要求完整看完区间,就不能有区间的覆盖.同时要让区间与区间的距离尽量小.
我们在选下一个节目时首先保证他开始的时间要在上一个节目结束之后,然后从所有符合条件的节目当中选取结束时间最早的即可.
于是可以对节目结束时间进行小到大的排序.如图:
image.png
然后先选取第一个区间,然后以 " 下一个节目的开始时间 >= 上一个节目的结束时间 " 为条件逐个往下选择.
代码:
/*电视节目对象*/
public class TVshow {
private int start;
private int end;
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public TVshow(int start, int end) {
this.start = start;
this.end = end;
}
}
/*对节目排序*/
import java.util.Comparator;
public class Cmpimplements Comparator {
@Override
public int compare(TVshow o1, TVshow o2) {
return (o1.getEnd()>o2.getEnd())?1:-1;//按结束时间排序
}
}
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
while(input.hasNextLine()) {
int number = input.nextInt();
if(number ==0)break;
TVshow [] tVshows =new TVshow[number];//存放电视节目对象
for (int i =0;i < number;i++) {
int start_time = input.nextInt();
int end_time = input.nextInt();
tVshows[i] =new TVshow(start_time,end_time);//存放时间区间
}
Arrays.sort(tVshows,new Cmp());//排序
int value_num =0;//记录最多可以看多少节目
int pre_etime =0;//上一个节目的结束时间
for (int i =0;i < number;i++) {
int stime = tVshows[i].getStart();
int etime = tVshows[i].getEnd();
if(stime >= pre_etime) { //判断条件
value_num++;
pre_etime = etime;
}
}
System.out.println(value_num);
}
}
}
/*
12
1 3
3 4
0 7
3 8
2 9
5 10
6 12
4 14
10 15
8 18
15 19
15 20
*/