P1047 [NOIP 2005 普及组] 校门外的树

记录14

#include <bits/stdc++.h>
using namespace std;
int main() {
	int l,m,u,v,a[10010]={},cnt=0;
	cin>>l>>m;
	for(int i=0;i<=l;i++) a[i]=1;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		for(int j=u;j<=v;j++) a[j]=0;
	} 
	for(int i=0;i<=l;i++) if(a[i]==1) cnt++;
	cout<<cnt;
	return 0; 
}

突破点

将这些树都移走后,马路上剩余的树木数量👉求范围数的情况

区域之间可能有重合的部分,现在要把这些区域中的树(包括区域端点处的两棵树)移走

👉大范围内去除小范围的数,同时可能小范围有重叠

思路

  1. 既然去除范围数,直接开数组,下标来对应范围数,数组下标一开始都是1,代表有效数
  2. 把要去除的范围内的数,下标改为0,表示不能用
  3. 记录范围内有效的下标数量

代码简析

int l,m,u,v,a[10010]={},cnt=0;

a[10010]={}数组开到10010的原因是:

对于 100% 的数据,保证 1≤l≤10^{4}

如果程序出现RE情况,注意下是不是数组的范围小了,关于RE的常出现问题跟解决方法,我会放在文章的补充部分

注意:a[10]={0}可表示a[10]的每一个存储都是0,但是a[10]={1},只有a[0]=1,其他都是0。为了方便,我们可以采用a[10]={}的操作来进行初始化a数组都为0

for(int i=0;i<=l;i++) a[i]=1;

要是想让数组a都为1,那么通过循环来初始化数组为1(即道路上种满了树)

for(int i=1;i<=m;i++){
		cin>>u>>v;
		for(int j=u;j<=v;j++) a[j]=0;
	} 

把出现的无效数的下标(即题目中要去除的树)都改为0

for(int i=0;i<=l;i++) if(a[i]==1) cnt++;

最后从头到尾来看一下还有哪些有效数(即道路上还剩哪些树),cnt++数一下

注意:for循环与if条件判断,只有一行代码的时候,可以不加{},直接写在一行就行了

补充

在洛谷平台上,运行时错误(Runtime Error,简称RE)通常是因为程序在运行过程中遇到了一些异常情况,导致无法正常执行。以下是一些常见的导致RE的原因及其解决方法:

1. 数组越界

数组越界是导致RE的常见原因之一。当访问数组时,如果下标超出了数组的声明范围,就会导致运行时错误。

解决方法:
  • 确保数组的大小足够大,能够容纳所有需要的数据。

  • 检查循环的终止条件,确保不会访问数组之外的元素。

2. 数组开太大

如果数组的大小设置得过大,超出了内存限制,也会导致RE。

解决方法:
  • 根据实际需要合理设置数组大小,避免浪费内存。

3. 除以零

在程序中出现除以零的操作,会导致运行时错误。

解决方法:
  • 在进行除法运算前,检查除数是否为零,避免除以零的情况。

4. 递归或循环导致的栈溢出

如果递归或循环的深度过大,可能会导致栈溢出,从而引发RE。

解决方法:
  • 优化递归或循环逻辑,减少深度。

  • 如果可能,尝试将递归转换为迭代。

5. 非法内存访问

访问未初始化的内存或已释放的内存,也可能导致RE。

解决方法:
  • 确保所有变量在使用前都已正确初始化。

  • 避免访问已释放的内存。

6. 输入输出格式问题

洛谷对输入输出格式要求严格,如果输出格式不符合要求,可能会导致RE。

解决方法:
  • 仔细检查题目要求的输入输出格式,确保程序的输出完全符合要求。

7. 编译器和环境差异

洛谷使用特定版本的编译器,可能与本地开发环境不同。某些新特性或语法可能在洛谷环境中不被支持。

解决方法:
  • 检查洛谷使用的编译器版本,并确保代码兼容该版本。

  • 避免使用洛谷编译器不支持的新特性。

8. 文件编码问题

洛谷仅支持标准UTF-8编码,如果文件编码不正确,可能会导致编译错误。

解决方法:
  • 使用文本编辑器检查并转换文件编码为标准UTF-8。

9. 头文件路径差异

洛谷环境中不存在自定义头文件或路径,依赖外部库的代码可能无法正常编译。

解决方法:
  • 确保所有头文件都存在于洛谷的环境中,或者使用标准库头文件。

10. 宏定义冲突

洛谷环境预定义了部分宏,这些宏可能与代码中定义的宏发生冲突。

解决方法:
  • 避免使用常见的宏名称,或者使用条件编译指令来规避冲突。

通过以上方法,可以有效排查和解决洛谷平台上出现的RE问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值