UVa 10020 (最小区间覆盖) Minimal coverage

题意:

数轴上有n个闭区间[ai, bi],选择尽量少的区间覆盖一条指定线段[0, m]

算法:

[start, end]为已经覆盖到的区间

这是一道贪心

把各个区间先按照左端点从小到大排序,更新start为end,如果区间1在start的右端,则无解,因为其他区间更不可能覆盖到

然后在剩下的能覆盖到start的区间里面选择能覆盖到最右端的区间并更新end,然后记录在path里面。如果end的已经将m覆盖则退出循环

如果遍历完所有的区间后end依然没能覆盖到start,则无解

最后按照parh里面记录的路径输出区间即可

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 const int maxn = 100000 + 10;
 9
10 struct Range
11 {
12     int a, b;
13     inline bool operator< (const Range& rhs) const
14     {
15         return a < rhs.a || (a == rhs.a && b < rhs.b);
16     }
17 }ranges[maxn];
18 int path[maxn];
19
20 int main(void)
21 {
22     #ifdef LOCAL
23         freopen("10020in.txt", "r", stdin);
24     #endif
25
26     int T;
27     scanf("%d", &T);
28     while(T--)
29     {
30         int a, b, m, n = 0;
31         scanf("%d", &m);
32         while(scanf("%d%d", &a, &b) == 2)
33         {
34             if(a == 0 && b == 0)    break;
35             if(a > m)    continue;
36             if(a < 0)    a = 0;
37             ranges[n].a = a;
38             ranges[n++].b = b;
39         }
40         sort(ranges, ranges + n);
41         int minCover = 0;
42         int start = 0, end = 0;
43         for(int i = 0; i < n; )
44         {
45             start = end;
46             if(ranges[i].a > start)
47                 break;
48             while(i < n && ranges[i].a <= start)
49             {
50                 if(ranges[i].b > end)
51                 {
52                     end = ranges[i].b;
53                     path[minCover] = i;
54                 }
55                 ++i;
56             }
57             ++minCover;
58             if(end >= m)    break;
59         }
60         if(end < m)    minCover = 0;
61         printf("%d\n", minCover);
62         for(int i = 0; i < minCover; ++i)
63             printf("%d %d\n", ranges[path[i]].a, ranges[path[i]].b);
64         if(T)
65             printf("\n");
66     }
67     return 0;
68 }

代码君

时间: 2024-11-05 02:39:50

UVa 10020 (最小区间覆盖) Minimal coverage的相关文章

UVA - 221(区间覆盖)

 Urban Elevations  An elevation of a collection of buildings is an orthogonal projection of the buildings onto a vertical plane. An external elevation of a city would show the skyline and the faces of the ``visible" buildings of the city as viewed fr

POJ - 2376 Cleaning Shifts 贪心(最小区间覆盖)

Cleaning Shifts Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some cleaning chores around the barn. He always wants to have one cow working on cleaning things up and has divided the day into T shifts (1 <= T <= 1,000,000

UVA - 1615 Highway 区间覆盖

题目大意:在平面上有n个点和一个值D,要求再长度为L的x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过D 解题思路:算出每个点的区间范围.区间的重叠部分由几个区间构成就有几个点满足要求. #include<cstdio> #include<algorithm> #include<cmath> #define maxn 100010 using namespace std; double L, D; int n; struct vill

uva 10020 Minimal coverage 【贪心】+【区间完全覆盖】

Minimal coverage The Problem Given several segments of line (int the X axis) with coordinates [Li,Ri]. You are to choose the minimal amount of them, such they would completely cover the segment [0,M]. The Input The first line is the number of test ca

【区间覆盖问题】uva 10020 - Minimal coverage

可以说是区间覆盖问题的例题... Note: 区间包含+排序扫描: 要求覆盖区间[s, t]; 1.把各区间按照Left从小到大排序,如果区间1的起点大于s,则无解(因为其他区间的左起点更大):否则选择起点在s的最长区间; 2.选择区间[li, ri]后,新的起点应更新为ri,并且忽略所有区间在ri之前的部分:  Minimal coverage  The Problem Given several segments of line (int the X axis) with coordinat

uva 10020 Minimal coverage(贪心,区间覆盖)

这道题一读就是经典的区间问题,是区间覆盖,敲过之后还有花了很长的调试时间,还是我不熟练,现在做题确实挺慢 的,简单题目也要做好久,没事,慢慢来.最重要的要确保正确率和心态问题,认真对待,调试找到了好多bug,一些 细节问题...都是刚开始没有注意到的.交了之后RE,在数组上多加了两个0.A了,,uva老是不提示数据有多大, 所以只能乱开... 思路: 先对区间按左边的点进行排序,如果当前需要涵盖的区间为[x,y],那么在排序的区间中到左边小于x,右 边最大的那个区间,设为Max,然后更新想找的区

UVa 10020 - Minimal coverage(区间覆盖、贪心)

算法入门经典关于区间覆盖的讲解: 8.4.6:区间覆盖问题 数轴上有n个区间[ai,bi],选择尽量少的区间覆盖一条指定线段[s,t]. [分析] 突破口是区间的包含和排序扫描,不过要先进行一次预处理.每个区间在[s,t]外的部分应该首先被切除掉,因为他们的存在是没有意义的.在预处理后,在相互包含的情况下,小区间显然不应该考虑. 把区间按照a从小到大排序.如果区间1的七点不是s,无解,否则选择起点在s的最长区间.选择此区间[ai,bi]后,新的起点应该设置为bi,并且忽略所有区间在bi之前的部分

uva10020 - Minimal coverage(区间覆盖)

题目:uva10020 - Minimal coverage(区间覆盖) 题目大意:给出一些线段,然后问怎样取能使得最少的线段覆盖区间[0, M]. 解题思路:先预处理掉那些和区间[0,M]不沾边的线段. 将线段按照起点小的排序. 接着遍历这些线段.首先先判断起点最小的点是否<=0,如果不满足这个说明它不能覆盖区间. 然后每次都小于等于当前覆盖的起点的最长线段,之后要将起点更新成这个最长线段的终点.然后接着判断下一条线段.如果更新了起点发现依然找不到满足条件的线段,说明不能覆盖. 最后还要看一下

uva 10020- Minimal coverage (贪心思想 简单区间覆盖)

题目大意:给出一个范围M,然后给出若干的区间,以0 0 终止, 要求用最少的区间将0 ~M 覆盖,输出最少个数以及方案. 解题思路:典型的区间覆盖问题,算法竞赛入门经典P154上有讲. /*author: charkj_z */ /*time: 0.108s */ /*rank: 674 */ /*为什么不把没用的地方去掉? 因为去掉了我觉得不像我能写出来的*/ /*Ac code : */ #include<stdio.h> #include<string.h> #include