2461: 寒假回家看电视
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 244 Solved: 113
[ Submit][ Status][ Web Board]
Description
寒假到了,小明回到家和爸妈打声招呼就奔向电视了,作为一个资深电视迷,一定想看尽量多的完整的电视节目,以弥补学校枯燥的学习生活。假设你已经知道了所有小明喜欢看的电视节目的转播时间表,请你帮助小明合理安排时间(目标是能看尽量多的完整节目)
Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
Sample Input
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
Sample Output
5
何为贪心?
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
解题的一般步骤是:
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。
分析:看到本题时的第一反应是数据好多,无规律可循。一开始想的是通过搜索二叉树来做本题,路径最长的就是题目解,但经过长时间的思考后发现自己无法实现代码,这就很尴尬了,这道题也就不了了之了。后来看到某篇博文中写的一篇关于的选择活动的题目,其实与本题差不多,只要先选则早结束的电视节目就可以看到最多的电视节目,有了这个思路问题就迎刃而解了,而这种方法就是贪心的一种,奉上java版的代码。
import java.util.*;
public class 寒假回家看电视{
static int n;
public static void sort(time[] t) {
time temp;
for(int i=0;i<n-1;i++) {
for(int j=0;j<n-i-1;j++) {
if(t[j+1].end<t[j].end) {
temp=t[j];
t[j]=t[j+1];
t[j+1]=temp;
}
}
}
}
public static int f(time[] t) {
int i=0,num=1;
for(int j=1;j<n;j++) {
if(t[j].begin>=t[i].end) {
i=j;
num++;
}
}
return num;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
while(n!=0) {
time[] t=new time[n+1]; //存储电视节目的开始和结束时间
int max=0;
for(int i=0;i<n;i++) {
t[i]=new time();
int a=in.nextInt();
int b=in.nextInt();
t[i].begin=a;
t[i].end=b;
}
sort(t);
System.out.println(f(t));
n=in.nextInt();
}
}
}
class time{
int begin;
int end;
}