洛谷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 1≤l≤104, 1 ≤ m ≤ 100 1 \leq m \leq 100 1≤m≤100, 0 ≤ u ≤ v ≤ l 0 \leq u \leq v \leq l 0≤u≤v≤l。
【题目来源】
NOIP 2005 普及组第二题
题目解析
题目大意
首先知道了有一个长度为 l l l 的马路,且每隔一米就栽了一棵树,因此可以把这个长度为 l l l 的马路看作一根数轴。现在要在数轴上选取若干个区间,而在区间内的树都将被移除,并且区间的数量、区间是否重叠都由用户的输入决定。最后计算减去这几个区间后还剩下多少棵树。
题目分析
对于马路上的所有树,每一棵树都可以对应一个唯一的位置,因此可以考虑用一个一维数组来存储每一棵树,而数组内的没一个元素可以使用二进制的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;
}