void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
Input
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
 

Output
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行
把时间按照end的时间从小到达排序,之后贪心解决
View Code
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <iostream>
4 #include <string.h>
5 #include <algorithm>
6  using namespace std;
7  struct circle
8 {
9 int begin,end;
10 }circle[10001];
11 typedef struct circle CIR;
12 //qsort的比较函数
13 int cmp( const void *a,const void *b)
14 {
15 return ((CIR*)a)->end - ((CIR*)b)->end;
16 }
17 //sort的比较函数
18 bool cmp1(CIR a, CIR b)
19 {
20 return a.end < b.end;
21 }
22 /**************************************************************************/
23 int n;
24 int flag[10001];
25 void Greedy() //贪心。。
26 {
27 memset(flag,0,sizeof(flag));
28 int j=0;
29 flag[j] = 1;
30 for(int i=1; i<n; i++)
31 if( circle[i].begin >= circle[j].end )
32 {
33 flag[i] = 1;
34 j = i;
35 }
36 else
37 flag[i] = 0;
38 }
39 int main(void)
40 {
41 while( cin >> n && n )
42 {
43 int sum = 0;
44 for(int i=0; i<n; i++)
45 cin >> circle[i].begin >> circle[i].end;
46 // sort(circle,circle+n,cmp1);
47 qsort( circle, n, sizeof(CIR),cmp);
48 Greedy();
49 for(int i=0; i<n; i++)
50 if( flag[i] == 0 )
51 sum ++;
52 cout << sum << endl;
53 }
54 return 0;
55 }
posted on 2011-05-07 17:34  void-man  阅读(394)  评论(0)    收藏  举报