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

来源:互联网 发布:微信公众号 java sdk 编辑:程序博客网 时间:2024/06/05 11:34
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
 

Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
 

Sample Input
121 33 40 73 815 1915 2010 158 186 125 104 142 90
 

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 ;}}}
简单的公式推导,推了半天,无语……
0 0
原创粉丝点击