uva 10020 Minimal coverage
10858 ワード
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=961
欲張り、ソート、左端に欲張り、最大右端を探します.
View Code
欲張り、ソート、左端に欲張り、最大右端を探します.
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
",t1);
70 for(int i=1; i<=t1; i++)
71 {
72 printf("%d %d
",ans[i].l,ans[i].r);
73 }
74 }
75 else printf("0
");
76 }
77 return 0;
78 }
View Code