1091 线段的重叠 

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

 收藏

 关注

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

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

Input

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

Output

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

Input示例

5
1 5
2 4
2 8
3 7
7 9

Output示例

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代码

第一种

#include<bits/stdc++.h>
using namespace std;
struct wzy{
int begin,end;
}p[50000+10];
bool cmp(wzy u,wzy v)
{
if(u.begin==v.begin)
return u.end<v.end;
else
return u.begin<v.begin;
}
int main()
{
int n,i,k;
int maxn=0;
cin>>n;
for(i=0;i<n;i++)
cin>>p[i].begin>>p[i].end;
sort(p,p+n,cmp);
for(i=1,k=p[0].end;i<n;i++)
{
if(p[i].end>=k)
{
maxn=max(maxn,k-p[i].begin);
k=p[i].end;
}
else
{
maxn=max(maxn,p[i].end-p[i].begin);
}
}
cout<<maxn<<endl;
return 0;
}

第二种

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e6+10;
using namespace std;
struct wzy
{
int first,end;
}p[maxn];
bool cmp(wzy u,wzy v)
{
if(u.first==v.first)
return u.end>v.end;
return u.first<v.first;
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].first>>p[i].end;
}
sort(p,p+n,cmp);
for(int i=0;i<n;i++)
cout<<p[i].first<<"==========="<<p[i].end<<endl;
int ans;
int _=0;
int s=p[0].first,e=p[0].end;
for(int i=1;i<n;i++)
{
if(s<=p[i].first&&e<p[i].end)
ans=e-p[i].first;
else if(s<=p[i].first&&e>=p[i].end)
ans=p[i].end-p[i].first;
_=max(ans,_);
if(e>=p[i].end)
continue;
s=p[i].first;
e=p[i].end;
}
cout<<_<<endl;
return 0;
}

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. c++ primer plus 第五章 课后题答案

    #include <iostream> using namespace std; int main() { ; cout << "Please enter two n ...

  2. [Java学习] Java虚拟机(JVM)以及跨平台原理

    相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...

  3. mysql--------四种索引类型

    一.索引的类型 mysql索引的四种类型:主键索引.唯一索引.普通索引和全文索引.通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力.索引优化时mysql中的一种优化方式.索引的作 ...

  4. Spring Boot 启动 Struts 报冲突

    错误信息如下: Caused by: com.opensymphony.xwork2.config.ConfigurationException: Bean type class com.opensy ...

  5. Mashmokh and ACM CodeForces - 414D (贪心)

    大意: 给定n结点树, 有k桶水, p块钱, 初始可以任选不超过k个点(不能选根结点), 在每个点放一桶水, 然后开始游戏. 游戏每一轮开始时, 可以任选若干个节点关闭, 花费为关闭结点储存水的数量和 ...

  6. CentOS查看分区的方式

    看ls /dev然后挂载 df -T  只可以查看已经挂载的分区和文件系统类型 fdisk -l 可以显示出所有挂载和未挂载的分区,但不显示文件系统类型 parted -l 可以查看未挂载的文件系统类 ...

  7. C++面试问题详解

    1.定义一个全局变量放在.cpp文件还是.h文件,原因是什么 在cpp文件中定义变量,h文件用来声明变量的作用域,使用extern声明的变量可以在本编译单元或其他编译单元中使用. 举例如下: a.h文 ...

  8. JS-图片控制-动画管理模块

    animateManage.js ;(function(window,document,undefined){ var _aniQueue = [], //动画队列 --- ani:动画,Queue: ...

  9. eclipse properties 文件查看和编辑插件 Properties Editor

    Properties Edito官网地址:http://propedit.sourceforge.jp/index_en.html Properties Edito安装地址:http://proped ...

  10. UVALive 6322 最大匹配...

    /* *e...大概明白了.首先用最大匹配看看是不是存在符合题意的匹配.然后呢.对枚举找到每个位置符合的字母里最小的那个. *判断是否能构成最大匹配.直到找完最后一个位置输出就好了.. *还是有些不理 ...