[NOIP2005]校门外的树

因为Z把我拉到他文章里去,所以我要反击

他的文章链接

好了开始主题

那是一个风和日丽的下午

MNZ:抄我?

我看到了这篇文章· ·

MNZ:还给我评论了

所以我要反击

MNZ:不是说过了吗?

我:这老师给我讲过,我还做过了

MNZ:我预测对了

我:啊这不是一道橙题是道红的?

MNZ:你看我代码多少,当然是红的

################正片开始!

MNZ:《片》


因为Z在结尾说让我写,所以我要把代码贴出来

题目链接跳转他的文章链接

第一次代码

首先定义变量

int l,m,s=0;

考虑到要删除的头和尾保存没意义,所以可以在后面循环里定义
然后输入
这里我犯了一个错误,这个文章修改了一次,因为我不知道为什么l要+1,这里说一下,因为从0开始到l,一共l+1棵树

	cin>>l>>m;
	for(int i=0;i<m;i++){
		int head,tail;
		scanf("%d%d",&head,&tail);//养成好习惯,循环输入就用scanf,除了字符串
		s+=tail-head;
	}
	cout<<l+1-s;

提交一看!

0分!!!

第二次代码

为什么呢》
仔细分析一下,连样例也过不了
因为删掉的区域可能会重叠,这样就会重复算
怎么办呢?难道要循环遍历重合的部分?那就变成黄题了!

我们要请出我们的办法:构造数组!!!!!!

构造数组是什么?构造数组就是一个bool类型数组,在本题中,我们可以用0表示有树,1表示没树,这样就算重叠了也没事,因为已经是1的再被赋值为1还是1

	for(int i=0;i<m;i++){
		int head,tail;
		scanf("%d%d",&head,&tail);
		for(int j=head;j<=tail;j++){
		    flag[j]=true;
		}
	}
	for(int i=0;i<l;i++){//因为从0开始所以要i=0;i<l
	    if(flag[i])s++;
	}
	cout<<l+1-s;
	return 0;
}

提交一看!

70分!!!

第三次代码

你说有没有一种可能,我可以在运算过程中加?
答案是:可以!
贴代码

#include<bits/stdc++.h>
using namespace std;
int l,m,s=0;
bool flag[(int)1e4];
int main(){
	cin>>l>>m;
	for(int i=0;i<m;i++){
		int head,tail;
		scanf("%d%d",&head,&tail);
		for(int j=head;j<=tail;j++){
		    if(!flag[j]){
		    	flag[j]=true;
		    	s++;
		    }
		}
	}
	cout<<l+1-s;
	return 0;
}

虽然这样体现不出可重复赋值的性质了,但也是一种方法
我和MNZ代码不一样,MNZ是求还剩多少,我是求没了多少然后用总数减

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值