题目:http://acm.hdu.edu.cn/showproblem.php?pid=2037
贪心的经典题
思路:要看到最多数量的节目,即贪最多数量,需尽可能早点结束当前所看的节目从而进行下一个节目。为了这样做,需要进行时间上的排序,那个节目开始的早就先看哪个,排序按照节目结束的时间进行排列,尽量做到节目间的无缝对接。
代码:
#include<stdio.h>
struct time
{
int st;//start time开始时间
int et;//end time结束时间
};
int main()
{
int i,j,k,n,count;
struct time t[105],p;
while(~scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
scanf("%d%d",&t[i].st,&t[i].et);
for(i=1;i<n;i++)//根据结束时间对节目进行冒泡排序
for(j=0;j<n-i;j++)
if(t[j].et>t[j+1].et)
{
p=t[j];
t[j]=t[j+1];
t[j+1]=p;
}
for(i=1,j=0,count=1;i<n;i++)//j是现在看的进度条(从第0个开始),i是对未看节目的履历(从第1个开始)
{
if(t[j].et<=t[i].st)//若所看的节目结束时间比下一个早的话
{
count++;//好,我把现在这个看完就去看下一个。所看的节目数量+1
j=i;//进入下一个节目
}
else
continue;//若下一个节目开始时间早于现在看的这个,则下一个节目不看了。continue结束单次循环
}
printf("%d\n",count);
}
return 0;
}</span>