题目:暑假不ac
题目要求我们统计能看尽可能多的完整节目的个数。
首先看到尽可能多的完整节目要求这些节目的持续时间短,在相同的开始时间下,选择节目时长短的那个节目。且这些节目的时间不能有冲撞,但允许前一个节目的结束时间与下一个节目的开始时间相同。
我一开始的想法是定义一个结构体,里面有开始时间和结束时间,还有一个节目时长,节目时长等于(结束时间-开始时间)
结构体
但是这个结构体行不通,因为定义的fir和end不是静态的值,time不可以这样赋值。
但是事实上,在比较节目的时候,如果单单用节目时长来排序的话,会有漏洞,所以应该用另外以一种方法,直接比较节目的开始时间与结束时间。
以节目的结束时间有小到大排列,这样较快结束的节目就会放在前面,且假如两个节目结束时间相同,那么节目开始时间晚的那个节目排在前面。因为开始时间晚说明这个节目持续时间更短。
接下来就是在这个已经排好序的结构体数组中,选择开始时间晚于上个节目的结束时间的节目就可以了
#include <stdio.h>
struct TV{
int end,fir;
};
void sort (struct TV a[],int n){//给结构体数组排序
struct TV temp;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[i].end==a[j].end&&a[i].fir<a[j].fir||a[i].end>a[j].end){//按结束时间从小到大排序,结束时间相同的选择开始时间晚的
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
int judge(struct TV a[],int n){//选择符合条件的节目
int num=1;
int end;
end=a[0].end;
for(int i=1;i<n;i++){
if(a[i].fir>=end) {//节目开始时间大于上个节目结束时间
num++;
end=a[i].end;
}
}
return num;
}
int main(){
int n;
int num;
struct TV a[25];
while(1){
scanf("%d",&n);
if(n==0) break;
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].fir,&a[i].end);
}
sort(a,n);
num=judge(a,n);
printf("%d\n",num);
}
return 0;
}