HDU(2037)贪心算法之时间序列

输入数据包含多个测试实例,每个测试实例的第一行只有一个整数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
#include
#include
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 ;
		}
	}
}
简单的公式推导,推了半天,无语……
 
  
 
  
 
  
 
  
 
  
 
  
 
  
 
  

你可能感兴趣的:(HDU(2037)贪心算法之时间序列)