校门外的树(刷数组、区间合并)笔记

这篇博客探讨了如何处理马路两侧的树与地铁建设区域的冲突问题。通过两种不同的方法,即使用布尔数组标记树木和区间合并,来计算在移除受影响的树木后,马路上还剩下多少棵树。第一种方法是初始化一个布尔数组,将被移除的树标记为真,然后统计未被标记的树的数量。第二种方法是先对区间进行排序,然后逐个合并区间,更新当前有效区间的边界,最终计算剩余树木。
摘要由CSDN通过智能技术生成

校门外的树

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
刷数组
开一个bool类型的数组tree[L],表示每个位置上的数有没有被砍掉。
对于每个区间[a,b]

#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
const int N = 10010;
int n, m;
bool tree[N];

int main()
{
    cin>>n>>m;
    for(int i = 0; i < m; i ++)
    {
        int l, r;
        cin>> l >> r;
        for(int j = l; j <= r; j++) tree[j] = true;//将被砍的树标记为1;
        
    }
    int res = 0;
    for(int i = 0; i <= n; i ++)
    {
        if(tree[i] == false)//数组中为0的数为还剩下的树;
            res ++;
    }
    cout<<res<<endl;
    return 0;
}

区间合并
1.先将所有区间按左端点排序
2.从前往后依次扫描每个区间,维护当前正在合并的区间的左右端点[st, ed],对于当前枚举的区间[q[i].x,q[i].y]
case1:如果ed<q[i].x
将[st, ed]放在答案集合中,再令st=q[i].x,ed=q[i].y
case2:如果ed>=[i].x
令 ed=max(ed,q[i].y)

#include<cstring>
#include<iostream>
#include<algorithm>

#define x first
#define y second

using namespace std;
typedef pair<int, int> PII;
const int N = 110;
int n, m;
PII q[N];

int main()
{
   int sum = 0;
   cin >>n >> m;
   for(int i = 0;i < m; i ++) cin >> q[i].x>>q[i].y;
   sort(q,q+m);
   int st = 0,ed = -1;
   for(int i = 0;i < m; i ++)
       if(ed < q[i].x)
       {
           sum += ed -st + 1;
           st = q[i].x, ed=q[i].y;
        }
        else ed = max(ed, q[i].y);
    sum += ed-st+1;
    cout<<n+1-sum<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值