问题 B: 【贪心】电视节目安排

问题 B: 【贪心】电视节目安排
时间限制: 1 Sec 内存限制: 64 MB
提交: 218 解决: 119
[提交] [状态] [讨论版] [命题人:admin]
题目描述
李旭琳发现小墨老师在班上是最顽劣的学生(没有之一),但他也有安静的时候,例如在看电视的时候。像什么“谍战剧”啊,“翻拍剧”啊,“婆媳戏”啊,“后宫剧”啊都是他的最爱。他甚至会事先查询所有喜欢看的电视节目的转播时间表并煞有介事的用红蓝铅笔列出计划,然后合理安排,以看到尽量多的完整节目。

输入
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n≤100),表示喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1≤i≤n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。

输出
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。

样例输入
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
样例输出
5

思路:贪心法:题目要求输出能看到的最多的完整的节目,首先需要按结束时间生序排序,当结束时间相同的,按开始时间升序排序。 然后从前往后计数。

#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
struct str
{
	int begin;
	int end;
}a[100];
int cmp(str b,str c)
{
	return b.end<c.end||(b.end==c.end&&b.begin<c.begin);  //进行比较 
}
int main()
{
	int n;
	cin>>n;
	while(n!=0)
	{
		for(int i=0;i<n;i++)
			scanf("%d %d",&a[i].begin,&a[i].end);
		sort(a,a+n,cmp);//  按照结束时间升序,如果结束时间相同,按开始时间升序 
		int k=0;
		int s=1;
		for(int i=1;i<n;i++)
			if(a[i].begin>=a[k].end)
			{
				s++;
				k=i;	
			}
		cout<<s<<endl;
		cin>>n;
	}
	return 0;
 }

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/84893591