1. 程式人生 > >問題 B: 【貪心】電視節目安排

問題 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;
 }