校大门外长度为L的马路上的一排树

/*描述某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包...
摘要由CSDN通过智能技术生成

描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。
我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;
数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。
这些区域用它们在数轴上的起始点和终止点表示。
已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。
现在要把这些区域中的树(包括区域端点处的两棵树)移走。
你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),
L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。
接下来的M行每行包含两个不同的整数,
用一个空格隔开,表示一个区域的起始点和终止点的坐标。
对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
输出
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

/*
描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。
我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;
数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。
这些区域用它们在数轴上的起始点和终止
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述某校门外长度为l的马路上一排,每两棵相邻之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴的位置,另一端在l的位置;数轴上的每个整数点,即,1,2,……,l,都种有一棵。 由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的(包括区域端点处的两棵)移走。你的任务是计算将这些都移走后,马路上还有多少棵。 解题思路: 首先,我们可以将所有要移走的的位置都标记出来,然后再遍历整个马路,计算没有被标记的的数量即可。 代码实现: ### 回答2: 首先,我们可以将每个区域内的都移走,这可以通过计算每个区域的长度(终止点坐标减去起始点坐标再加1)来得到。接着,需要判断每个区域的边界处是否还有,如果有,则将其移走。最后,数轴上剩余的的数量就是答案。 具体实现上,可以使用一个长度为l+1的数组表示数轴上的每个点是否有。首先,将数组中所有位置的值初始化为1,即都种有。然后,遍历每个区域,将区域内的位置的值设为0,表示这些已经被移走了。接着,遍历每个区域的边界处,判断是否有,并将其移走。遍历完成后,数组中值为1的位置的数量就是剩余的的数量。 代码实现: int main() { int l, n; int start, end; cin >> l >> n; int* road = new int[l+1]; memset(road, 1, (l+1)*sizeof(int)); //初始化,1表示该位置有 for (int i = 0; i < n; i++) { cin >> start >> end; for (int j = start; j <= end; j++) { road[j] = 0; //移走该区域内的 } if (road[start-1] == 1) { road[start-1] = 0; //移走该区域左边的 } if (road[end+1] == 1) { road[end+1] = 0; //移走该区域右边的 } } int count = 0; for (int i = 0; i <= l; i++) { if (road[i] == 1) { count++; //计算剩余的的数量 } } cout << count << endl; return 0; } ### 回答3: 这道题可以通过计算要移除掉的的数量,来求出剩余的数量。我们可以先将要移除掉的区间保存到一个数组中,然后遍历这个数组,在遍历的过程中计算出要移除的的数量。最后用总的数量减去移除的的数量,即可得到剩余的数量。 具体实现步骤如下: 1. 定义变量l和n,分别表示马路的长度的数量。此时n=l+1,因为每个整数点上都有一棵。 2. 定义一个数组broken_intervals,存储要移除的区间。数组中的每个元素包含两个整数,表示该区间的起始点和终止点。 3. 遍历数组broken_intervals,计算出要移除的的数量total_broken_trees。对于每个区间,我们可以先将其起始点和终止点都减去1,然后再将它们之间的距离加上1(因为区间端点处的两棵也要被移除)。最后将每个区间上要移除的的数量相加即可得到total_broken_trees。 4. 将总的数量n减去total_broken_trees,即为剩余的数量。 完整代码如下: ```python l = 10 # 马路的长度 n = l + 1 # 的数量,每个整数点上都有一棵 broken_intervals = [(2, 5), (7, 8)] # 要移除的区间 total_broken_trees = 0 # 要移除的的数量 for start, end in broken_intervals: distance = end - start + 1 # 区间的长度 total_broken_trees += distance # 将区间上要移除的的数量相加 remaining_trees = n - total_broken_trees # 剩余的数量 print(remaining_trees) ``` 输出结果为:6。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值