zoukankan      html  css  js  c++  java
  • 4.22 每日一题题解

    小sun的假期

    涉及知识点:

    • 枚举/双指针/区间合并

    solution:

    • (题目是让你输出最大的未被覆盖的区间长度)
    • (首先按照l从小到大排序,如果l相等就按照r从小到大排序)
    • (什么时候才会产生一段连起来的假期呢?初始化j = 1,i = 2,类似双指针)
    • (遍历i,a[j].r <= a[i].l (i > j)的时候,假期长度为a[i].l - a[j].r-1,然后令j=i)
    • $否则,如果a[j].r > a[i].l,两个区间相交,没有假期,a[j].r 就应该更新成max(a[j].r , a[i].r]) $
    • (关于左端点和右端点,需要分情况讨论,为了不那么麻烦,就加了两个区间:)
    • (a[++n].l = 0,a[n].r = 0;a[++n].l = m+1,a[n].r = m+1;)

    std:

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int maxx = 100005;
    struct node{
        int l,r;
    }a[maxx];
    bool cmp(node p1,node p2){
        if(p1.l == p2.l)
            return p1.r < p2.r;
        return p1.l < p2.l;
    }
    int main()
    {
        int n,m,ans = 0;
        scanf("%d %d",&m,&n);
        for(int i=1;i<=n;i++){
            scanf("%d %d",&a[i].l,&a[i].r);
        }
        a[++n].l = 0,a[n].r = 0;
        a[++n].l = m+1,a[n].r = m+1;
        sort(a+1,a+1+n,cmp);
        for(int i=2,j=1;i<=n;i++)
        {
            if(a[i].l <= a[j].r)
                a[j].r = max(a[j].r,a[i].r);
            else{
                ans = max(ans,a[i].l - a[j].r -1);
                j = i;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    【排序算法汇总】
    Redis是否安装
    分布式与集群
    Redis学习
    简单算法定义见解
    KMP算法
    红黑树
    JSP与Servlet的关系
    7、创建图及图的遍历(java实现)
    6、二叉树树(java实现)
  • 原文地址:https://www.cnblogs.com/QFNU-ACM/p/12749650.html
Copyright © 2011-2022 走看看