题目来源
P1047 [NOIP2005 普及组] 校门外的树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 l 的位置;数轴上的每个整数点,即 0,1,2,…l,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入格式
第一行有两个整数,分别表示马路的长度 l 和区域的数目 m。
接下来 m 行,每行两个整数 u,v,表示一个区域的起始点和终止点的坐标。
输出格式
输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。
思路
题目已经给过,我们可以把这排树看成一个数轴,那从零开始,每个点都有一个树。数轴为一条直线,由此可以想到用一个一维数组来存储树的数量。个人感觉本题的难点在于如何判断此区域的树有没有被挖走,如果已被挖走,便不能再次被计入统计。题目已给,对于 100% 的数据,保证 1≤l≤10^4,1≤m≤100,0≤u≤v≤l,因此一维数组只需要开10^4即10000即可。首先一维数组要想具有标记的作用,个人首先想到的是bool数组。先定义数组
#include <bits/stdc++.h>
using namespace std;
bool a[10050];//定义bool数组
int main(int argc, char** argv) {
return 0;
}
接着,定义l,m,n(n为最终剩余树木的数量),输入l,m,并把数组全都设定为1(思路:1为有树,0为无树,判断起来方便)
#include <bits/stdc++.h>
using namespace std;
bool a[10050];//定义bool数组
int main(int argc, char** argv) {
int l,m,n=0;//定义lmn
cin>>l>>m;//输入
for(int i=0;i<=l;i++)//for循环,将数组全部设为1
a[i]=1;//设为1
return 0;
}
接下来,再次进行循环。需要循环m次,每次都为一个节点,即数据范围。所以就要用到双重循环嵌套
定义b1,b2为循环范围,即m个b1,b2.
#include <bits/stdc++.h>
using namespace std;
bool a[10050];//定义bool数组
int main(int argc, char** argv) {
int l,m,n=0;//定义lmn
cin>>l>>m;//输入
for(int i=0;i<=l;i++)//for循环,将数组全部设为1
a[i]=1;//设为1
for(int i=0;i<m;i++)//循环m次
{
int b1,b2;//定义循环范围
cin>>b1>>b2;//输入
for(int j=b1;j<=b2;j++)//从b1到b2依次将每位设为0,即无树
a[j]=0;
}
return 0;
}
好了,程序最难的部分已完成,接下来的收尾狗都能做十分简单。还是老样子,for循环遍历每一位,加上if判断是否为else,若不,n++,最后输出n,即答案
#include <bits/stdc++.h>
using namespace std;
bool a[10050];//定义bool数组
int main(int argc, char** argv) {
int l,m,n=0;//定义lmn
cin>>l>>m;//输入
for(int i=0;i<=l;i++)//for循环,将数组全部设为1
a[i]=1;//设为1
for(int i=0;i<m;i++)//循环m次
{
int b1,b2;//定义循环范围
cin>>b1>>b2;//输入
for(int j=b1;j<=b2;j++)//从b1到b2依次将每位设为0,即无树
a[j]=0;
}
for(int k=0;k<=l;k++)//循环遍历数组
{
if(a[k]==1)//如果有树
n++;//结果++
}
cout<<n;//输出答案
return 0;
}
AC代码
#include <bits/stdc++.h>
using namespace std;
bool a[10050];
int main(int argc, char** argv) {
int l,m,n=0;
cin>>l>>m;
for(int i=0;i<=l;i++)
a[i]=1;
for(int i=0;i<m;i++)
{
int b1,b2;
cin>>b1>>b2;
for(int j=b1;j<=b2;j++)
a[j]=0;
}
for(int k=0;k<=l;k++)
{
if(a[k]==1)
n++;
}
cout<<n;
return 0;
}
结果
太简单了,简直是易如反掌啊