51nod 1091 线段的重叠(贪心)

题目意思:

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091

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

题目分析:
贪心算法,

AC代码:
<span style="font-size:18px;">/**
 *贪心,按照线段左端点升序排序,
 *左端点相等,右端点降序排序
 */
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAX=50005;
struct Node{
    int b,e;
};
Node a[MAX];
int cmp(Node p1,Node p2){
    if(p1.b<p2.b) return 1;
    else if(p1.b==p2.b&&p1.e>p2.e) return 1;
    return 0;
}
int main()
{
    int n;
    while(cin>>n){
        for(int i=0;i<n;i++){
            cin>>a[i].b>>a[i].e;
        }
        sort(a,a+n,cmp);
        int res=0;
        Node s=a[0];
        for(int i=1;i<n;i++){
            if(a[i].e<=s.e){//线段i在线段i-1内
                res=max(res,a[i].e-a[i].b);
            }
            else if(a[i].b<=s.e&&a[i].e>s.e){
                res=max(res,s.e-a[i].b);
                s=a[i];//选择最靠后的线段
            }
        }
        cout<<res<<endl;
    }
    return 0;
}</span></span>

时间: 2024-08-10 21:23:06

51nod 1091 线段的重叠(贪心)的相关文章

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

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 

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

1091 线段的重叠 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 输出最长重复区间的长度. 看的别人的

1090 3个数和为0 1091 线段的重叠 1182 完美字符串 1283 最小周长 1284 2 3 5 7的倍数

1090 3个数和为0 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序. Input 第1行,1个数N,N为数组的长度(0 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9) Output 如果没有符合条件的组合,输出No Solu

贪心-线段的重叠

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 

51nod 1264 线段相交(几何)

题目链接:51nod 1264 线段相交 如果两条线段相交,则需满足一条线段的一个端点在另一条线段上,或者 两条线段都分别跨越另一条线段延伸的直线上.(如果点p1位于直线p3p4的一边,而点p2位于该直线的另一边,则称p1p2跨越了这条直线p3p4.) 可以用叉乘来判断p3p1.p3p2是否在p3p4的不同方向(顺.逆时针)(线段p1p2跨越了直线p3p4)以及p1p4.p1p3是否在p1p2的不同方向(线段p3p4跨越了直线p1p2)来判断是否相交. 关于叉乘方向的判断,来,伸出你的右手...

线段的重叠(贪心)

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 先按线段起点升序排序,此时有两大种情况: 第一种是第二根线段的左边在第一根线段右边的右边, 即两根线段不相交,此时要将终点更新,因为是按起点升序排序,如果第二根的就不相交那之后的线段都不相交: 第二种大情况是相交,其第一种小情况是包含,此时要将重叠长度与最大重叠比较,但不需要更新终点, 第二种小情况是相交但不包含,此时不仅要比较最大重叠长度,还需要更新终点.

51nod 1163 最高的奖励(贪心+优先队列)

题目链接:51nod 1163 最高的奖励 看着这题我立马就想到昨天也做了一道贪心加优先队列的题了奥. 按任务最晚结束时间从小到大排序,依次选择任务,如果该任务最晚结束时间比当前时间点晚,则将该任务的奖励值压入队列,否则将队列中最小的任务的奖励值替换,优先队列按奖励值小的优先. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using name

51nod 1287 线段树

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 简单的线段树题目,直接写个二分查找大于等于x的最小位置就好了. 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define inf 0x3f3f3f3f 4 #define LL long long 5 const int MAX=50005; 6 int A[MAX]; 7 struct SegTree

CODEVS1643 线段覆盖3[贪心]

1643 线段覆盖 3  时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选取其中k条线段使得这k条线段两两没有重合部分(端点可以重合),问最大的k为多少. 输入描述 Input Description 输入格式 输入文件的第1行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段. 输出描述 Output Description 输出格式 输出文件仅包括1个整数,为k的最大值 样例输入