• 小sun的假期【牛客】


    链接:https://ac.nowcoder.com/acm/contest/1085/A
    来源:牛客网

    应肖老师要求前来更新水一水

    题目描述

    小 sun 非常喜欢放假,尤其是那种连在一起的长假,在放假的时候小 sun 会感到快乐,快乐值等于连着放假的天数,现在小 sun 把他的安排表告诉你,希望你告诉他在他的安排表中, 他的最大快乐值。 

    当某天没有安排的时候就是放假。

    输入描述:

    第一行两个数n,m,代表总共有n天,m个安排。

    接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了。

    安排可能会重复。

    输出描述:

    输出一行,在这个安排表中,小sun最大的快乐值。
    示例1

    输入

    复制
    5 1
    2 3

    输出

    复制
    2

    备注:

    数据范围:
    n≤1e9,m≤1e5nleq 1e9, mleq 1e5n1e9,m1e5
    1≤l,r≤n1 leq l,rleq n1l,rn
    题意:

     

    在一条长为n的数轴上,用m个区间覆盖这条数轴,问最长未被覆盖的数轴长度。

    思路:

    线段树的染色法肯定是暴毙的,由此想到暴力动动小脑瓜。

    首先我们对m个区间的左端点进行排序,然后惊讶地发现只要从左到右更新最远的右端点并对未被覆盖的区间长度进行更新即可。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    const int maxn = 1e5+7;
    
    struct node{
        int l,r;
    }a[maxn];
    
    bool cmp(node a,node b)
    {
        /*if(a.l==b.l)
            return a.r>b.r;
        */
        return a.l<b.l;
    }
    
    int main()
    {
        int ans=0;
        int lf=1,rt=0;
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d",&a[i].l,&a[i].r);
        }
    
        sort(a+1,a+m+1,cmp);
        /*for(int i=1;i<=m;i++)
            printf("l:%d r:%d
    ",a[i].l,a[i].r);*/
        ans=(a[1].l-1);
        //printf("a:%d
    ",ans);
        rt=a[1].r;
        for(int i=2;i<=m;i++)
        {
            if(a[i].l>rt)
            {
                ans=max(ans,a[i].l-rt);
                rt=a[i].r;
            }
            else
            {
                if(a[i].r>rt)
                {
                    rt=a[i].r;
                }
                continue;
            }
        }
        ans=max(ans,n-rt);
        printf("%d
    ",ans);
        return 0;
    }

    方法二:

    肖老师说的pair

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <set>
    #include <ext/pb_ds/assoc_container.hpp>
    using namespace std;
    const int maxn = 1e5+7;
    
    set< pair <int,int> > s;
    
    int main()
    {
        int ans=0;
        int rt=0;
        int n,m;
        scanf("%d%d",&n,&m);
        int l,r;
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d",&l,&r);
            s.emplace(l,r);
        }
        for(auto i : s)
        {
            if(i.first>rt)
            {
                ans=max(ans,i.first-rt);
                rt=i.second;
            }
            else
            {
                if(i.second>rt)
                {
                    rt=i.second;
                }
                continue;
            }
        }
        ans=max(ans,n-rt);
        printf("%d
    ",ans);
    
        return 0;
    }

    本质上是一样的东西,set+emplace跑的并没有更快?

  • 相关阅读:
    构建之法第二次作业
    wav音频的剪切
    构建之法结对编程
    模拟数据库事务实现转账
    Quirks模式是什么?它和Standards模式有什么区别
    CSS都有哪些选择器?
    简述渐进增强和优雅降级之间的不同?
    市面上浏览器的内核分别是什么?有哪些?
    html与xhtml有什么区别?
    关于对WEB标准以及W3C的理解与认识问题
  • 原文地址:https://www.cnblogs.com/orangeko/p/11601252.html
Copyright © 2020-2023  润新知