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

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

[NOIP2005 普及组] 校门外的树

题目描述

某校大门外长度为 l l l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 1 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 0 0 的位置,另一端在 l l l 的位置;数轴上的每个整数点,即 0 , 1 , 2 , … , l 0,1,2,\dots,l 0,1,2,,l,都种有一棵树。

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

输入格式

第一行有两个整数,分别表示马路的长度 l l l 和区域的数目 m m m

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

输出格式

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

样例 #1

样例输入 #1

500 3
150 300
100 200
470 471

样例输出 #1

298

提示

【数据范围】

  • 对于 20 % 20\% 20% 的数据,保证区域之间没有重合的部分。
  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ l ≤ 1 0 4 1 \leq l \leq 10^4 1l104 1 ≤ m ≤ 100 1 \leq m \leq 100 1m100 0 ≤ u ≤ v ≤ l 0 \leq u \leq v \leq l 0uvl

【题目来源】

NOIP 2005 普及组第二题

题目解析

题目大意

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

题目分析

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

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

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

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

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

代码题解

    
    #include 
	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;
	 } 

你可能感兴趣的:(C++必刷题,算法,数据结构,c++,学习)