输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
5
几点说明:
1、本题明显是用贪心算法,先以结束时间为关键字对数据进行排序,筛选。
2、貌似在杭电ACM的测试系统上,直接用ti定义会导致编译错误,所以定义的时候需要写成struct ti,但是在visual stdio里面就没有问题。可能写成typedef就没问题了。
参考代码:
#include <stdio.h> #include <stdlib.h> struct ti { int start; int end; }; int compare(const void *a,const void *b); void main() { int n; int i; int count; int end; struct ti Array[101]; while(scanf("%d",&n) && n != 0) { if(n < 0) { continue; } count = 0; for(i = 0; i < n; ++i) { scanf("%d %d",&Array[i].start,&Array[i].end); } qsort(Array, n, sizeof(Array[0]), compare); end = Array[0].end; ++count; for(i = 1; i < n; ++i) { if(Array[i].start >= end) { ++count; end = Array[i].end; } } printf("%d\n",count); } } int compare(const void *a, const void *b) { const struct ti *p1 = (struct ti *)a; const struct ti *p2 = (struct ti *)b; return p1->end - p2->end; }