链接:

http://acm.timus.ru/problem.aspx?space=1&num=1303

按照贪心的思想,每次找到覆盖要求区间左端点时,右端点最大的线段,然后把要求覆盖的区间改为这个右端点到M这个区间。依次类推下去,这样的话就只需要扫一遍就可以找去来。

要做的预备工作就是将线段按照左端点的升序排序就可以了。

它的时间复杂度就是O(n)

代码一直WA,望大神指教

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<map>
  5. #include<vector>
  6. #include<set>
  7. #include<stack>
  8. #include<queue>
  9. #include<algorithm>
  10. #include<cmath>
  11. #include<stdlib.h>
  12. using namespace std;
  13. #define MAX(a,b) (a > b ? a : b)
  14. #define MIN(a,b) (a < b ? a : b)
  15. #define MAXN 200005
  16. #define INF 1000000007
  17. #define mem(a) memset(a,0,sizeof(a))
  18. #define judge(i) (ma[i].l<=L && ma[i].r>=L && ma[i].l != ma[i].r)//判断是否覆盖了点L
  19.  
  20. struct node{int l,r;}ma[MAXN];
  21. int ans[MAXN];
  22. int M,N,T;
  23. int L;
  24.  
  25. int cmp(node a,node b)
  26. {
  27. if(a.l != b.l)return a.l<b.l;
  28. else return a.r<b.r;
  29. }
  30.  
  31. int find_index(int s,int &i)//找到覆盖了点L而且右端点最大的点,并返回;
  32. //同时将后面要覆盖的点设置为它的右端点
  33. {
  34. i = s;
  35. int e = s,endd = ma[i].r;
  36. while(i < N && judge(i) )
  37. {
  38. if(ma[i].r > endd)
  39. {
  40. endd = ma[i].r;
  41. e = i;
  42. }
  43. i++;
  44. }
  45. L = endd;//endd就是满足覆盖条件下的最大的右端点
  46. //并将其设置为下次比较的左端点
  47. return e;//返回此次的线段的下标
  48. }
  49.  
  50. int main()
  51. {
  52. while(~scanf("%d",&M))
  53. {
  54. N=;
  55. int i;
  56. mem(ans);
  57. while(scanf("%d%d",&ma[N].l, &ma[N].r) && (ma[N].l || ma[N].r))
  58. {
  59. if(ma[N].r <= || ma[N].l>=M)ma[N].l = ma[N].r = INF;//吧在要求区间两端之外的线段去掉
  60. //吧它的左右端点值赋值为INF,这样的话排序时自然就会到最后方,也就相当于不用考虑
  61. N++;
  62. }
  63. sort(ma,ma+N,cmp);
  64.  
  65. L = ;//最初要被覆盖的点是0
  66. int num = ;
  67. for(i=;i<N;i++)
  68. {
  69. int t = i+;//将t设置为i+1,如果下面的judge成功,就会进入函数的while中,那么i会++,如果不成功,t=i+1
  70. if(judge(i)) ans[num++] = find_index(i,t);
  71. i = t-;//由于t相当于多+了1,所以-1
  72. if(L >= M)break;//一旦找到,就退出循环
  73. }
  74. if(L < M)printf("No solution\n");
  75. else
  76. {
  77. printf("%d\n",num);
  78. for(i=;i<num;i++)
  79. {
  80. printf("%d %d\n",ma[ans[i]].l,ma[ans[i]].r);
  81. }
  82. }
  83. }
  84. return ;
  85. }

ural 1303 Minimal Coverage(贪心)的更多相关文章

  1. 贪心 URAL 1303 Minimal Coverage

    题目传送门 /* 题意:最少需要多少条线段能覆盖[0, m]的长度 贪心:首先忽略被其他线段完全覆盖的线段,因为选取更长的更优 接着就是从p=0开始,以p点为标志,选取 (node[i].l < ...

  2. ural 1303 Minimal Coverage【贪心】

    链接: http://acm.timus.ru/problem.aspx?space=1&num=1303 http://acm.hust.edu.cn/vjudge/contest/view ...

  3. Ural 1303 Minimal Coverage(贪心)

    题目地址:Ural 1303 先按每一个线段的左端点排序,然后设置一个起点s.每次都从起点小于等于s的线段中找到一个右端点最大的. 并将该右端点作为新的起点s,然后继续找. 从左到右扫描一遍就可以. ...

  4. URAL 1303 Minimal Coverage

    URAL 1303 思路: dp+贪心,然后记录路径 mx[i]表示从i开始最大可以到的位置 sufmx[i]表从1-i的某个位置开始最大可以到达的位置 比普通的贪心效率要高很多 代码: #inclu ...

  5. URAL 1303. Minimal Coverage(DP)

    题目链接 又是输出路径...这题完全受上题影响,感觉两个题差不多..用了基本上一样的算法写了,这题比较纠结,就是卡内存啊...5000*5000的数组开不了..然后没办法,水了好几次MLE,看了一下虎 ...

  6. UVA 10020 Minimal coverage(贪心 + 区间覆盖问题)

     Minimal coverage  The Problem Given several segments of line (int the X axis) with coordinates [Li, ...

  7. uva.10020 Minimal coverage(贪心)

    10020 Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose t ...

  8. Minimal coverage (贪心,最小覆盖)

    题目大意:先确定一个M, 然后输入多组线段的左端和右端的端点坐标,然后让你求出来在所给的线段中能够 把[0, M] 区域完全覆盖完的最少需要的线段数,并输出这些线段的左右端点坐标. 思路分析: 线段区 ...

  9. uva 10020 Minimal coverage 【贪心】+【区间全然覆盖】

    Minimal coverage The Problem Given several segments of line (int the X axis) with coordinates [Li,Ri ...

随机推荐

  1. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

  2. LA 3029 - City Game (简单扫描线)

    题目链接 题意:给一个m*n的矩阵, 其中一些格子是空地(F), 其他是障碍(R).找一个全部由F 组成的面积最大的子矩阵, 输出其面积乘以3的结果. 思路:如果用枚举的方法,时间复杂度是O(m^2 ...

  3. Java 知识点:序列化

    首先明确一点:默认的序列化方法速度很慢,因为需要对整个对象和他的类都进行保存,因此我们建议自定义序列化格式. ObjectInputStream和ObjectOutputStream 用途 Objec ...

  4. web请求报出 “超过了最大请求长度” 【注意:重启IIS】

    摘自:http://www.cnblogs.com/loalongblogs/archive/2012/10/16/2726372.html web请求报出 “超过了最大请求长度”   错误原因:as ...

  5. HDU 4609 3-idiots (FFT-快速傅立叶变换)

    [题意]给定N个树枝,求从中取出三个可以围成三角形的概率 [思路] 2013多校训练第一场比赛1010题. 一开始就想到了O(n^2)枚举前两个树枝和的算法,赛后群里大牛说计算所有两个树枝和的情况可以 ...

  6. 反射小应用之DataTable和List<T>互操作

    在程序中,往往会遇到一些小情况,就是数据库取出来的时候为了方便直接将数据通过存储在DataSet或DataTable中,这样做的一个后果是在日后的的对数据进行”细“操作时,就发现它可能没有List&l ...

  7. HTTP请求中浏览器缓存

    本文导读:浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制.客户端缓存是否需要是可以在服务端代码上控制的.那就是响应头.响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容:如果请求信息是需要 ...

  8. Oracle EM 不能访问

    zwt2001267 原文 Oracle EM 不能访问 1. cmd控制启动EM: C:\Users\Administrator>emctl start dbconsoleEnvironmen ...

  9. Android aidl 打入jar解决方法

    工程上右键 选择export 然后取消选择这个工程里的所有的文件 点开到gen文件夹下选择aidl生成的 java文件 选择生成的java文件和src目录导出jar包即可

  10. Android Scrollview 内部组件android:layout_height="fill_parent"无效的解决办法

    Found the solution myself in the end. The problem was not with the LinearLayout,  but with the Scrol ...