UVa-10020 Minimal coverage **

 1 /*
2 * Uva-10020 最少区间覆盖-贪心
3 *
4 * 很直接的贪心。。 详见刘汝佳 《奥赛入门经典》
5 *
6 * 测试数据: http://www.algorithmist.com/index.php/UVa_10020#Input
7 *
8 */
9
10 #include <cstdio>
11 #include <algorithm>
12 using namespace std;
13
14 const int maxN = 100000 + 5;
15 int caseNum, m, intervalNum, ansList[maxN];
16
17 struct SData{
18 int x, y;
19 };
20 SData interval[maxN];
21
22 bool cmp(const SData lhs, const SData rhs){
23 return lhs.x < rhs.x;
24 }
25
26 int main(){
27 scanf("%d", &caseNum);
28 while(caseNum--){
29 scanf("%d", &m);
30
31 intervalNum = 0;
32 int tmpX, tmpY;
33 while(scanf("%d%d", &tmpX, &tmpY)){
34 if(tmpX == 0 && tmpY == 0)
35 break;
36
37 interval[intervalNum].x = tmpX;
38 interval[intervalNum++].y = tmpY;
39 }
40
41 sort(interval, interval + intervalNum, cmp);
42
43 int cover = 0, cur = 0, nextCover, nextCoverNum, i, ans = 0;
44 bool covered = 0; //注意初始化!!在这里WA了一次
45 while(cur < intervalNum){
46 nextCover = cover;
47 i = cur;
48 while(i < intervalNum && interval[i].x <= cover){
49 if(interval[i].y > nextCover){
50 nextCover = interval[i].y;
51 nextCoverNum = i;
52 }
53 i++;
54 }
55 if(i == cur) break;
56
57 cover = nextCover;
58 ansList[ans++] = nextCoverNum;
59 cur = i;
60 if(cover >= m){
61 covered = 1;
62 break;
63 }
64 }
65 if(covered){
66 printf("%d\n", ans);
67 for(int j=0; j<ans; j++){
68 printf("%d %d\n", interval[ansList[j]].x, interval[ansList[j]].y);
69 }
70 }
71 else printf("0\n");
72 if(caseNum > 0) printf("\n");
73
74 }
75
76
77 return 0;
78 }

    

 1 /*
2 另外,针对区间端点为整数的情形, 可以直接用数组存,不用排序,O(n)时间内解决。
3 即interval[i] = j, 表示以左端点为i的区间的右端点最大值为j。。
4 */
5 #include <cstdio>
6 #include <cstring>
7 using namespace std;
8
9 const int maxn = 50000 + 10;
10 int m, interval[maxn];
11
12 int main(){
13 memset(interval, -1, sizeof(interval));
14
15 scanf("%d", &m);
16 int tmpa, tmpb;
17 while(scanf("%d%d", &tmpa, &tmpb)){
18 if(tmpa==0 && tmpb==0) break;
19 if(tmpb < 0 || tmpa >= m) continue;
20 if(tmpa < 0) tmpa = 0;
21 if(interval[tmpa] < tmpb)
22 interval[tmpa] = tmpb;
23 }
24
25 int cover=0, cur=0, i=0, imax = 0, num = 0;
26 bool flag = 0;
27 while(i<m){
28 flag = 0;
29 for(; i<=cover; i++){
30 if(interval[i] > imax){
31 imax = interval[i];
32 cur = i;
33 }
34 }
35 if(imax == cover) break;
36
37 cover = imax;
38 num++;
39 if(cover >= m){
40 flag = 1;
41 break;
42 }
43 }
44
45 if(flag) printf("%d\n", num);
46 else printf("No solution\n");
47
48 return 0;
49 }



 

  

 

posted on 2011-10-04 23:32  龙豆  阅读(801)  评论(0编辑  收藏  举报

导航