YTU-2461: 寒假回家看电视

2461: 寒假回家看电视

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 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;
}

猜你喜欢

转载自blog.csdn.net/zw159357/article/details/79761246