4151:电影节
总时间限制:
1000ms
内存限制:
65536kB
描述
大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。
输入
多组数据。每组数据开头是n(n<=100),表示共n场电影。
接下来n行,每行两个整数(0到1000之间),表示一场电影的放映区间
n=0则数据结束
输出
对每组数据输出最多能看几部电影
样例输入
8 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 0
样例输出
3
解题思路:贪心算法,每次寻找最早结束的电影。首先将n场电影按结束时间从小到大的顺序排序。
代码如下:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct node{
int start;
int end;
}a[101];
int cmp(const void *a,const void *b){//C语言结构体的快排,从小到大排序
struct node *aa=(struct node *)a;
struct node *bb=(struct node *)b;
if(aa->end!=bb->end){
return(((aa->end)>(bb->end))?1:-1);
}else{
return ((aa->start)-(bb->start));
}
}
int main(int argc, char *argv[]) {
int n;
int number;
int endTime;
scanf("%d",&n);
while(n!=0){
int i=0;
for(i=0;i<n;i++){
scanf("%d%d",&a[i].start,&a[i].end);
}
qsort(a,n,sizeof(a[0]),cmp);//结束时间从小到大排序
number=1;//初始值为1
endTime=a[0].end;
for(i=1;i<n;i++){//不断地进行寻找
if(a[i].start>=endTime){
number++;
endTime=a[i].end;
}
}
printf("%d\n",number);
scanf("%d",&n);
}
return 0;
}