uva 10020 Minimal coverage

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=961

贪心,排序,对左端点贪,找最大右端点。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 6000000
 5 using namespace std;
 6 
 7 int t,m;
 8 int t1;
 9 int ll[maxn],rr[maxn];
10 struct node
11 {
12     int l,r;
13     int id;
14     bool operator <(const node &a)const
15     {
16         return (l<a.l)||(l==a.l&&r>a.r);
17     }
18 } p[maxn],ans[maxn];
19 
20 int main()
21 {
22     scanf("%d",&t);
23     while(t--)
24     {
25         t1=0;
26         scanf("%d",&m);
27         int cnt=0;
28         int l,r;
29         int num=0;
30         while(scanf("%d%d",&l,&r)!=EOF)
31         {
32             if(l==0&&r==0) break;
33             if(l>m||r<0) continue;
34             p[cnt].id=num;
35             p[cnt].l=l;
36             p[cnt++].r=r;
37         }
38         sort(p,p+cnt);
39         bool flag1=false;
40         int ll=0,rr=0;
41         while(1)
42         {
43             if(ll>=m)
44             {
45                 break;
46             }
47             flag1=false;
48             rr=0;
49             int pos;
50             for(int i=0; i<cnt; i++)
51             {
52                 if(p[i].l<=ll&&p[i].r>rr)
53                 {
54                     pos=i;
55                     rr=p[i].r;
56                     flag1=true;
57                 }
58             }
59             if(flag1)
60             {
61                t1++;
62                ans[t1]=p[pos];
63                ll=rr;
64             }
65             else break;
66         }
67         if(flag1)
68         {
69             printf("%d\n",t1);
70             for(int i=1; i<=t1; i++)
71             {
72                 printf("%d %d\n",ans[i].l,ans[i].r);
73             }
74         }
75         else printf("0\n");
76     }
77     return 0;
78 }
View Code

 

posted @ 2014-10-12 14:38  null1019  阅读(121)  评论(0编辑  收藏  举报