Day 8 acwing打卡 422.校门外的树

某校大门外长度为 LL 的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米。

我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 LL 的位置;数轴上的每个整数点,即 012L0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。

这些区域用它们在数轴上的起始点和终止点表示。

已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。

现在要把这些区域中的树(包括区域端点处的两棵树)移走。

你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

输入文件的第一行有两个整数 LL 和 MM,LL 代表马路的长度,MM 代表区域的数目,LL 和 MM 之间用一个空格隔开。

接下来的 MM 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出格式

输出文件包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

数据范围

1L100001≤L≤10000,
1M1001≤M≤100

输入样例:

500 3
150 300
100 200
470 471

输出样例:

298

#include<iostream>
using namespace std;

int L,M;

int main(){
    
    cin >> L >> M;
    bool tree[10010];
    
    for(int i = 0; i <= L; i++)
        tree[i] = true;
        
    int a, b;
    for(int i = 0; i < M; i++)
    {
        cin >> a >> b; 
        for(int j = a; j <= b; j++)
        {
            tree[j] = false;
        }
    }
    
    int sum = 0;
    for(int i = 0; i <= L; i++)
        if(tree[i])
            sum++;
            
    cout << sum;
    return 0;
}

另一种方法是区间合并,例如[2,3] [3,5]可以合并为[2,5]

#include<iostream>
#include<algorithm>
using namespace std;

typedef pair<int,int> pii;
bool tree[10010];
int L,M;

int main(){
    
    cin >> L >> M;
    for(int i = 0; i <= L; i++)
        tree[i] = true;
    
    
    pii p[110];
    
    int a, b;
    for(int i = 0; i < M; i++)
    {
        cin >> a >> b; 
        p[i].first = a;
        p[i].second = b;
    }
    
    sort(p,p+M);
    
    int l = p[0].first, r = p[0].second, sum = 0;
    
    for(int i = 1; i < M; i++)
    {
        if(p[i].first <= r)
            r = max(p[i].second,r);
        else{
            sum += r - l + 1;
            l = p[i].first; 
            r = p[i].second;
        }
    }
    
    sum += r - l + 1;
    cout << L + 1 - sum;
    
    return 0;
}
原文地址:https://www.cnblogs.com/xiaowangdatie/p/14524279.html