线段的重叠(贪心)

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

先按线段起点升序排序,此时有两大种情况:

第一种是第二根线段的左边在第一根线段右边的右边,

即两根线段不相交,此时要将终点更新,因为是按起点升序排序,如果第二根的就不相交那之后的线段都不相交;

第二种大情况是相交,其第一种小情况是包含,此时要将重叠长度与最大重叠比较,但不需要更新终点,

第二种小情况是相交但不包含,此时不仅要比较最大重叠长度,还需要更新终点。

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class Line
{
    public int left,right;
}
public class N1091 {

    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        Line []a=new Line [n];

        for(int i=0;i<n;i++)
        {
            a[i]=new Line();
            a[i].left=cin.nextInt();
            a[i].right=cin.nextInt();
        }
        Arrays.sort( a,new Comparator<Line> ()
        {
                public int compare(Line l1,Line l2)
                {
                    if(l1.left>=l2.left)
                        return 1;
                    else
                        return -1;
                }
        });
        int end=a[0].right,ans=0;

        for(int i=1;i<n;i++)
        {
            if(a[i].left>end)
                end=a[i].right;
            else
            {
                if(a[i].right<=end)
                    ans=max(ans,a[i].right-a[i].left);
                else
                {
                    ans=max(ans,end-a[i].left);
                    end=a[i].right;
                }
            }
        }
        System.out.println(ans);
    }
    public static int max(int a,int b)
        {
            return a>=b?a:b;
        }
}
时间: 2024-10-20 05:47:09

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

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 线段的重叠(贪心)

题目意思: 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个数

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

贪心-线段的重叠

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 

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

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的最大值 样例输入

hdu 5338 线段树+stl+贪心

下午比赛的时候写搓了,晚上重写一次就过了,o(╯□╰)o. 思路:按照字典序贪心,用线段树来维护区间最值,用set来维护求出答案的封闭区间. 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <set> 7 using namespace std; 8 9

Codeforces 85B. Embassy Queue【线段树、贪心】

题目大意: 每个人要办理签证都必须到大使馆中办理三种手续,而且这三种手续办的顺序是固定的.给出办理每种手续的窗口有多少个,办理每个手续花费的时间,有多少人会来办理手续,一级每个人会在什么时间来.要求的是所有人分别在大使馆待的最长时间是多少. 做法: 一种贪心的做法,由于只有三种手续,那么每个人进入办理的时候,保证选办理同种手续的所有窗口中最早等待的那一个窗口(为什么会有等待?因为该窗口办完了上一个,而下一个没能马上到这一个窗口).接下来对每个人分开处理,计算出每个人从进入大使馆到办完三种手续离开

Codeforces1099F. Cookies(线段树+dp+贪心+博弈)

题目链接:传送门 思路: 分析到处理节点时的吃cookie的顺序了,然鹅不会用线段树维护前缀和.技术门槛QAQ... 很容易想到可以从root开始搜索,每次深入消耗时间2*边权w. 然后对于深入到点u开始返回的话,想要尽量多地吃cookie,就要贪心地选择用时短的cookie,也就是: 当前节点为u,剩余时间为val时,最多能在1-u这条链上吃到多少个cookie. 一共有1e6个节点,所以这个贪心策略的实现复杂度要压到log级别...好难不会. 思路参考:Dream_maker_yk的博客 线