• 51nod1091(贪心)


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

    题意:中文题诶~

    思路:贪心;

    我们先将数据按照左端点升序排列,对于左端点一样的区间我们再按照右端点升序排列;其实对于左端点相同的区间影响答案的只是其中右端点最大的那个区间,我们可以将右端点坐标较小的区间去掉,不过那样操作比较麻烦,就不必去掉他们啦.这点很简单,就不细说了;

    假设我们将排序后的数据存储到gg结构体数组中,我们先令end=gg[0].right, ans=0,ans存储但前最大公共区间值;那么在gg[0]后面的区间与gg[0]有三种关系:

    1:gg[i].left>end, 即gg[i]与gg[0]不相交.此时我们要更新end=gg[i].end,因为我们是按照left升序怕排列gg的,所以在当前情况下gg[0]后面的区间都不会与gg[0]相交啦;

    2:gg[i].left<end,此种情况根据gg[i].right的大小又可以细分两种情况:

      a: gg[i].right<end, 此时我们需要检查是否要更新ans, ans=max(ans, end-gg[i].left);

      B: gg[i].right>=end,此时我们不仅要更新ans, 还要更新end, end=gg[i].right;

    如此遍历完gg数组,ans就是我们要的答案啦;

    代码:

     1 #include <bits/stdc++.h>
     2 #define MAXN 50010
     3 using namespace std;
     4 
     5 struct node{
     6     int left, right;
     7 };
     8 
     9 bool cmp(node a, node b){
    10     return a.left==b.left?a.right<b.right:a.left<b.left;
    11 }
    12 
    13 int main(void){
    14     int n;
    15     node gg[MAXN];
    16     cin >> n;
    17     for(int i=0; i<n; i++){
    18         cin >> gg[i].left >> gg[i].right;
    19     }
    20     sort(gg, gg+n, cmp);
    21     int ans=0, end=gg[0].right;
    22     for(int i=1; i<n; i++){
    23         if(gg[i].left<end){
    24             if(gg[i].right<end){
    25                 ans=max(ans, gg[i].right-gg[i].left);
    26             }else{
    27                 ans=max(ans, end-gg[i].left);
    28                 end=gg[i].right;
    29             }
    30         }else{
    31             end=gg[i].right;
    32         }
    33     }
    34     cout << ans << endl;
    35     return 0;
    36 }
  • 相关阅读:
    链表
    链式学习法:提升技术深度
    数组
    写点什么
    7 天掌握算法面试必考知识点: 作业安排及如何提交
    创建Mac OS root账户
    正则表达式匹配及替换
    Xcode 10 之New Build System & Legacy Build System 旧版构建系统
    性能指标:TPS、QPS、RT、吞吐量
    Objective-C和Swift语言特性
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6270608.html
Copyright © 2020-2023  润新知