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

题目来源

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

结果

太简单了,简直是易如反掌啊

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值