一、问题描述
有很多电视节目,给出它的起止时间,有的节目时间冲突,问能完整看完的节目有多少?
二、问题分析
经过分析,三种贪心策略,贪结束时间是最优的,所以实现逻辑如下:
1.将所有节目按照结束时间排序
2.择最早结束的电视节目,也就是排序后的第一个节目,并跳过与之冲突的节目
3.重复第2个步骤,知道节目为空
三、代码实现
#include <iostream>
#include <algorithm>
using namespace std;
struct Tvshow{
int begin,end;
}tvTime[20];
bool comp(Tvshow a,Tvshow b){
return a.end<b.end;
}
int main(){
int n;
cin>>n;
//读入电视节目起始和结束时间
for (int i=0;i<n;i++){
cin>>tvTime[i].begin;
cin>>tvTime[i].end;
}
//按照结束时间排序
sort(tvTime,tvTime+n,comp);
int temp=-1,count=0;//temp存储当前的结束时间,count记录节目数量
//选择最早结束的电视节目,也就是排序后的第一个节目
//并跳过与之冲突的节目
for(int i=0;i<n;i++){
if(tvTime[i].begin>=temp){
temp=tvTime[i].end;
count++;
}
}
cout<<"可看的电视节目有"<<count;
return 0;
}
四、运行结果