n个节目,都有开始时间,结束时间,(每个时刻只能看一个节目(一个节目一旦看了就看完)) 问张三想看这些节目,如何安排,可以使得看的总的节目数达到最大。
#include<iostream>
#define N 9
using namespace std;
struct jiemu{
int begin;
int end;
};
jiemu arr[N]={ {8,10},{9,12},{11,14},
{8,15},{12,16},{15,17},
{16,18},{18,21},{20,23} };
//T(n) = 排序n log(n) +贪心 n = O(nlog(n))
int choose[N];//0代表不选择,1代表选择
void print(){
for(int i=0;i<N;i++)
if(choose[i])
cout<<"选择第"<<i+1<<"个节目"<<endl;
}
void solve(){
int i=0;
choose[i]=1;//选取第一个节目
for(int j=1;j<N;){
//如果下一个节目开始大于上一个结束,则可以选择
if(arr[j].begin>=arr[i].end){
choose[j]=1;//选择
i=j;//移动选择标记
j=i+1;//移动到下一个节目
}else{
j++;//当前不选,移动到下一个节目
}
}
print();
}
int main(){
solve();
return 0;
}