输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
Sample Input
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
Sample Output
5#include<iostream> #include<algorithm> #include<stdio.h> using namespace std ; struct P { int begin , end ; }; int cmp( P p1 , P p2 ) { return p1.begin < p2.begin || ((p1.begin == p2.begin) && (p1.end < p2.end)) ; } int main() { int n ; while( cin >> n , n ) { P p[110] ; for( int i = 0 ; i < n ; i++ ) cin >> p[i].begin >> p[i].end ; sort(p,p+n,cmp) ; int count = 1 ; for(int j = 1 ; j < n ; j++) { if( p[j].begin >= p[j-1].end ) count++ ; else { if( p[j].end >= p[j-1].end ) { p[j].begin = p[j-1].begin ; p[j].end = p[j-1].end ; } } } cout << count << endl ; } return 0 ; }
很简单的一道题,结果跪了一个多小时,各种错误,首先是 :return p1.begin < p2.begin || ((p1.begin == p2.begin) && (p1.end < p2.end)) ;
总是把p1,p2弄掉一个写成 :
return p1.begin < p1.begin || ((p1.begin == p1.begin) && (p1.end < p1.end)) ;
已经不仅一次犯这种低级错误了,直接导致排序错误,答案出错,下次一定不能再犯这种低级错误;
其次是:
for(int j = 1 ; j < n ; j++) { if( p[j].begin >= p[j-1].end ) count++ ; else { if( p[j].end >= p[j-1].end ) { p[j].begin = p[j-1].begin ; p[j].end = p[j-1].end ; } } }
简单的公式推导,推了半天,无语……