zoukankan      html  css  js  c++  java
  • 1091 线段的重叠

    先按起点排序,起点相同时终点大的在前面。排序后遍历,记录当前起点与前面最大终点之差和当前线段长度最小值,记录最优解。

    为什么要这样排序?题目要求线段长度最长,就是尽可能让覆盖区域的起点很小,终点很大。可以在取最优解时先保证起点小,这样只需取当前能取到的最大终点得到解。

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    typedef long long LL;
    #define MAXN 1001
    #define INF 0x3f3f3f3f
    struct node
    {
        LL beg,end;
    };
    bool cmp(node a,node b)
    {
        return (a.beg==b.beg)?a.end>b.end:a.beg<b.beg;
    }
    int main()
    {
        LL n,temp;
        vector<node> vv;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            node t;
            cin>>t.beg>>t.end;
            vv.push_back(t);
        }
        sort(vv.begin(),vv.end(),cmp);
        LL ans = -1,ed = vv[0].end;
        for(int i=1;i<n;i++)
        {
            ans = max(ans,min(vv[i].end,ed)-vv[i].beg);
            ed = max(ed,vv[i].end);
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    正则表达式
    字节流和字符流小练习
    File汇总
    java一不容易就容易错的知识点汇总
    a++和++a区别
    线程安全的3种方式
    bs4和css选择器的基本使用
    清点作业情况
    cookie和session的使用
    用post请求制作翻译
  • 原文地址:https://www.cnblogs.com/joeylee97/p/6258945.html
Copyright © 2011-2022 走看看