答案来自王道出版的书籍《计算机考研机试指南》
思路:如果最优解的第一个就节目并不是结束最早的节目,那么我们可以直接用结束时间最早的节目代替该解中的第一个节目,替换后的阶也是最优解。这样我们就可以得出当第一个节目选择所有节目中结束时间最早的节目,这样一定不会得不到最优解的。于是,在我们所要求得最优解中,第一个被收看的节目可以安排所有节目中结束时间最早的节目(若有多个,则可以任意选择一个)。只有当第一个被收看的节目被决定了以后,那么第二个呢?
只要不断重复上述过程,我们就会知道:在选择第X个(X>=1)节目时,一定是在选择收看完前X-1个节目后吗,其他所有都可以收看节目中结束时间最早的节目,这就是我们要找的“贪心策略”。在每次选择节目的时候,都不断利用这种贪心策略,就可以完成最优解的求解。
/*
题目描述:今年暑假不AC
思路:贪心算法
*/
#include<cstdio>
#include<algorithm>
using namespace std;
class program{
public:
int startTime;
int endTime;
bool operator<(const program& compareobject)const{
return this->endTime < compareobject.endTime;
}
};
program buff[100];
int main(int argc, char** argv){
//program* buf = new program(0,0);
int n = 0;
//输入
while(scanf("%d",&n) != EOF){
if(0 == n){
break;
}
for (int i = 0; i < n ; ++i){
scanf("%d%d",&buff[i].startTime,&buff[i].endTime);
}
//排序
sort(buff,buff+n) ;
//记录当前时间变量和答案计数初始值为0
int currentTime = 0;
int ans = 0;
for(int i = 0; i < n; ++i){
//若当前时间小于等于节目开始时间,那么在收看该在节目里结束时间最早的节目
if(currentTime <= buff[i].startTime){
currentTime = buff[i].endTime;//当前时间变为该节目结束的时间
++ans;
}
}
printf("%d\n",ans);
}
return 0;
}