看电视(贪心算法)

≯℡__Kan透↙ 提交于 2020-02-04 13:07:27

问题 A: 看电视

时间限制: 1 Sec  内存限制: 32 MB
提交: 927  解决: 432
[提交][状态][讨论版][命题人:外部导入]

题目描述

暑假到了,小明终于可以开心的看电视了。但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目。
现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗?

输入

输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。
接下来n行,每行输入两个整数si和ei(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

样例输出

5code:

/*算法:使用贪心算法,时间按照开始时间从小到大的顺序排列,
*如果开始时间相同,那么按照结束时间从小到大的顺序排列。之
*后使用lastTV保留上一个最优解,如果下一个区间的开始时间大
*于lastTV的结束时间,那么更新lastTV,直至所有区间被遍历完
*/
#include <iostream>
#include <algorithm>


/*节目结构*/
struct program {
int si, ei;
};
program TV[1000];


bool cmp(program a, program b) {
if (a.ei != b.ei)
{
return a.ei < b.ei; //返回开始时间小的
}
else
{
return a.si < b.si; //返回结束时间小的
}
}
int main()
{
using namespace std;


int n;


while (cin >> n)
{
if (!n)
{
break;
}


for (int i = 0; i < n; i++)
{
cin >> TV[i].si >> TV[i].ei;
}


/*根据开始时间从小到大排序,如果相等,那么结束时间小的在前*/
sort(TV, TV + n, cmp);


/*for (int i = 0; i < n; i++)
{
cout << TV[i].si <<" "<< TV[i].ei<<endl;
}*/


int lastTV = TV[0].ei, count = 1;
//cout << lastTV<<endl;
for (int i = 1; i < n; i++)
{
if (TV[i].si >= lastTV)
{
count++;
lastTV = TV[i].ei;
}
}
cout << count << endl;


}


// system("pause");
return 0;
}

 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!