1091 线段的重叠 

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题

 收藏

 关注

X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。

给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。

Input

  1. 1行:线段的数量N(2 <= N <= 50000)。
  2. 2 - N + 1行:每行2个数,线段的起点和终点。(0 <= s , e <= 10^9)

Output

  1. 输出最长重复区间的长度。

Input示例

  1. 5
  2. 1 5
  3. 2 4
  4. 2 8
  5. 3 7
  6. 7 9

Output示例

  1. 4

思路

有两种写法,但是思路都是差不多的,不同的是排序的方法有点区别

  1. 按照区间起点升序排序,如果起点相同,按终点升序排序。用一个数n记录排序后第一个区间的终点,然后对后面n-1个区间进行比较。如果第i个区间的终点小于k,那么区间覆盖的长度为第i个的终点减去起点,此时k值不变。如果第i个区间的终点大于k,那么区间覆盖的长度为k减去第i个区间的起点,并把k值更新为第i个区间的终点。记录下此时区间覆盖长度的最大值
  2. 按照区间起点升序排序,如果起点相同,按终点降序排序。用两个数s,e记录第一个区间的起点和终点。每次进行过一个区间,如果e小于区间的终点,更新s,e的值。(和上一种写法基本上是一样的,对于s,e的更新也是和上面k的更新条件一样,唯一不同的就是排序方式)。

AC代码

第一种

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct wzy{
  4. int begin,end;
  5. }p[50000+10];
  6. bool cmp(wzy u,wzy v)
  7. {
  8. if(u.begin==v.begin)
  9. return u.end<v.end;
  10. else
  11. return u.begin<v.begin;
  12. }
  13. int main()
  14. {
  15. int n,i,k;
  16. int maxn=0;
  17. cin>>n;
  18. for(i=0;i<n;i++)
  19. cin>>p[i].begin>>p[i].end;
  20. sort(p,p+n,cmp);
  21. for(i=1,k=p[0].end;i<n;i++)
  22. {
  23. if(p[i].end>=k)
  24. {
  25. maxn=max(maxn,k-p[i].begin);
  26. k=p[i].end;
  27. }
  28. else
  29. {
  30. maxn=max(maxn,p[i].end-p[i].begin);
  31. }
  32. }
  33. cout<<maxn<<endl;
  34. return 0;
  35. }

第二种

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <math.h>
  6. #include <limits.h>
  7. #include <map>
  8. #include <stack>
  9. #include <queue>
  10. #include <vector>
  11. #include <set>
  12. #include <string>
  13. #define ll long long
  14. #define ms(a) memset(a,0,sizeof(a))
  15. #define pi acos(-1.0)
  16. #define INF 0x3f3f3f3f
  17. const double E=exp(1);
  18. const int maxn=1e6+10;
  19. using namespace std;
  20. struct wzy
  21. {
  22. int first,end;
  23. }p[maxn];
  24. bool cmp(wzy u,wzy v)
  25. {
  26. if(u.first==v.first)
  27. return u.end>v.end;
  28. return u.first<v.first;
  29. }
  30. int main(int argc, char const *argv[])
  31. {
  32. ios::sync_with_stdio(false);
  33. int n;
  34. cin>>n;
  35. for(int i=0;i<n;i++)
  36. {
  37. cin>>p[i].first>>p[i].end;
  38. }
  39. sort(p,p+n,cmp);
  40. for(int i=0;i<n;i++)
  41. cout<<p[i].first<<"==========="<<p[i].end<<endl;
  42. int ans;
  43. int _=0;
  44. int s=p[0].first,e=p[0].end;
  45. for(int i=1;i<n;i++)
  46. {
  47. if(s<=p[i].first&&e<p[i].end)
  48. ans=e-p[i].first;
  49. else if(s<=p[i].first&&e>=p[i].end)
  50. ans=p[i].end-p[i].first;
  51. _=max(ans,_);
  52. if(e>=p[i].end)
  53. continue;
  54. s=p[i].first;
  55. e=p[i].end;
  56. }
  57. cout<<_<<endl;
  58. return 0;
  59. }

51Nod 1091:线段的重叠(贪心)的更多相关文章

  1. 51Nod 1091 线段的重叠(贪心+区间相关,板子题)

    1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...

  2. 51Nod 1091 线段的重叠(贪心+区间相关

    1091 线段的重叠 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两 ...

  3. [51nod] 1091 线段的重叠 贪心

    X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长 ...

  4. 51nod 1091 线段的重叠【贪心/区间覆盖类】

    1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...

  5. 51Nod 1091 线段的重叠 (贪心)

    X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]. 给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长 ...

  6. 51 Nod 1091 线段的重叠 (贪心算法)

    原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 思路分析:通过读题不难发现这是一道涉及贪心算法的题,刚 ...

  7. 51Nod 1091 线段重叠 | 贪心

    Input示例 5 1 5 2 4 2 8 3 7 7 9 Output示例 4 first try: O(n^2):二层循环,减法取最大 后五个time limit exceeded #includ ...

  8. 51 Nod 1091 线段的重叠

    2017-09-24 19:51:41 writer:pprp 上一个题目就是关于线段重叠最大值,这个是找区间最长重合? 给你n个线段,然后让你在其中选择两条,使两条尽可能重合多一点 解决方法; 1. ...

  9. 【51nod-1091】线段的重叠(贪心)

    所有线段按起点从小到大排序,然后比较出最大的重叠部分.比如第i条线段和第j条线段进行比较找出重叠部分(j>i),当第j条线段的右端点<第i条线段的右端点,此时可以让i继续比较后面的线段:如 ...

随机推荐

  1. 《剑指offer》第四题(二维数组中的查找)

    // 二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数,判断数组 ...

  2. U3D协程yield的使用和理解

    部分内容参考网址:http://blog.csdn.net/huang9012/article/details/29595747 Win7+U3D 4.6.7 1.在c#中使用①首选需要定义一个返回值 ...

  3. ninja install error

    ninja install ...... CMake Error at cmake_install.cmake:36 (FILE):  file INSTALL cannot find  " ...

  4. URAL 1029 Ministry

    URAL 1029 思路: dp+记录路径 状态:dp[i][j]表示到(i,j)这个位置为止的最少花费 初始状态:dp[1][i]=a[1][i](1<=i<=m) 状态转移:dp[i] ...

  5. Java 集合-Set接口和三个子类实现

    2017-10-31 19:20:45 Set 一个不包含重复元素的 collection.无序且唯一. HashSet LinkedHashSet TreeSet HashSet是使用哈希表(has ...

  6. LeetCode--168--Excel表列名称

    问题描述: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 ...

  7. Serega and Fun CodeForces - 455D (分块 或 splay)

    大意:给定n元素序列, 2种操作 将区间$[l,r]$循环右移1位 询问$[l,r]$中有多少个等于k的元素 现在给定q个操作, 输出操作2的询问结果, 强制在线 思路1: 分块 每个块内维护一个链表 ...

  8. python-day63--前端

    一. 响应式介绍 - 响应式布局是什么? 同一个网页在不同的终端上呈现不同的布局等 - 响应式怎么实现的? 1. CSS3 media query 媒体查询 2. JS去控制网页的布局和样式等 - 缺 ...

  9. nyoj-489-dinic/建图

    哭泣天使 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 Doctor Who乘着Tardis带着Amy来到了一个星球,一开Tadis大门,发现这个星球上有个壮观的石 ...

  10. ASP.NET简介

    1.什么是ASP.NET? ASP.NET是一套免费的网络架构,是为了构建一个伟大的或者说非常不错的网站或网络应用,并同时使用了一些前端技术,比如说HTML,CSS和JavaScript ASP.NE ...