• Codeup_575A_剩下的树


    [提交][状态][讨论版][命题人:外部导入]

    题目描述

    有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。     现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。     可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。

    输入

    两个整数L(1<=L<=10000)和M(1<=M<=100)。     接下来有M组整数,每组有一对数字。

    输出

     可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。

    样例输入

    4 2
    1 2
    0 2
    11 2
    1 5
    4 7
    0 0

    样例输出

    2
    5
    
    思想:首先对输入的区间进行一stat的升序排序,然后进行遍历,并实时记录最大的end,判断第i+1的start-maxend是否大于2
    若是大于则将sum+=a[i+1]-maxend-1.

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #define Max 10005
    using namespace std;
    
    struct range
    {
        int start;
        int end;
    }tree[Max];
    
    bool compare(range a,range b)
    {
        return a.start<b.start;
    }
    
    
    int main(void)
    {
        freopen("in.txt","r",stdin);
        int L,n;
        while(scanf("%d%d",&L,&n)!=EOF&&(L||n))
        {
            int sum=0;
            for(int i=1;i<=n;i++)
                scanf("%d%d",&tree[i].start,&tree[i].end);
            
            sort(tree+1,tree+1+n,compare);
            
            int maxend=0;
            sum+=tree[1].start-0;
            for(int i=1;i<=n-1;i++)
            {
                if(tree[i].end>maxend)
                    maxend=tree[i].end;
                if(tree[i+1].start-maxend>=2)
                    sum+=tree[i+1].start-maxend-1;
            }
            if(tree[n].end>maxend)
                maxend=tree[n].end;
            sum+=L-maxend;
            
            printf("%d
    ",sum);
        }
        
        fclose(stdin);
        return 0;
    }
  • 相关阅读:
    集群架构搭建
    THUWC2019 游记
    【集训队互测2015】未来程序·改
    [NOIP2014普及组T1]珠心算测验
    [CF912D]Fishes
    [POJ2409]Let it Bead
    golang 统计系统测试覆盖率
    tcpdump常用方法
    数学闯关引发的思考
    linux lsof常用方法
  • 原文地址:https://www.cnblogs.com/phaLQ/p/10056555.html
Copyright © 2020-2023  润新知