洛谷P1047 [NOIP2005 普及组] 校门外的树

洛谷P1047 [NOIP2005 普及组] 校门外的树
[NOIP2005 普及组] 校门外的树
题目描述
某校大门外长度为 l ll 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 11 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 00 的位置,另一端在 l ll 的位置;数轴上的每个整数点,即 0 , 1 , 2 , … , l 0,1,2,\dots,l0,1,2,…,l,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式
第一行有两个整数,分别表示马路的长度 l ll 和区域的数目 m mm。

接下来 m mm 行,每行两个整数 u , v u, vu,v,表示一个区域的起始点和终止点的坐标。

输出格式
输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

样例 #1
样例输入 #1
500 3
150 300
100 200
470 471
1
2
3
4
样例输出 #1
298
1
提示
【数据范围】

对于 20 % 20%20% 的数据,保证区域之间没有重合的部分。
对于 100 % 100%100% 的数据,保证 1 ≤ l ≤ 1 0 4 1 \leq l \leq 10^41≤l≤10
4
,1 ≤ m ≤ 100 1 \leq m \leq 1001≤m≤100,0 ≤ u ≤ v ≤ l 0 \leq u \leq v \leq l0≤u≤v≤l。
【题目来源】

NOIP 2005 普及组第二题

题目解析
题目大意
首先知道了有一个长度为 l ll 的马路,且每隔一米就栽了一棵树,因此可以把这个长度为 l ll 的马路看作一根数轴。现在要在数轴上选取若干个区间,而在区间内的树都将被移除,并且区间的数量、区间是否重叠都由用户的输入决定。最后计算减去这几个区间后还剩下多少棵树。

题目分析
对于马路上的所有树,每一棵树都可以对应一个唯一的位置,因此可以考虑用一个一维数组来存储每一棵树,而数组内的没一个元素可以使用二进制的0和1来存储树是否存在的状态。

而对于要建地铁,也就是要删除树的区间,我的想法是每一个区间都有一头一尾,因此可以使用一个二维数组来存储每一个区间。而二维数组的行数就是用户输入的区间的数量。

首先需要遍历存储树状态的一维数组,让其所有值都为1,即初始状态时所有位置上都有树。

接下俩可以遍历整个一维数组,依次读取二维数组内的每一个数对,在这个范围内把一维数组的初值1均改为0,记为将该地方的树移走。

最后定义一个计数器,遍历更改后的一维数组,当元素位置不为0时计数器加一。

代码题解

#include <iostream>
using namespace std;
int main()
{
	int l[10001]={0};
	int length,m,count=0;
	cin>>length>>m;
	int tree[m][2];
	for(int i=0;i<length;i++)
	{
		l[i]=0;
	}
	
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<2;j++)
		{
			cin>>tree[i][j];
		}
	}

	for(int i=0;i<m;i++)
	{
		for(int j=tree[i][0];j<=tree[i][1];j++)
		{
			l[j]=1;	
		}
	}
	
	for (int i=0;i<=length;i++)
	{
		if(l[i]!=1)
		{
			count++;
		}
	}
	cout<<count;
 } 

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_47351846/article/details/136072301

posted @ 2024-02-29 12:48  笠大  阅读(186)  评论(0)    收藏  举报