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;
}
原文地址:https://www.cnblogs.com/phaLQ/p/10056555.html