因为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是求还剩多少,我是求没了多少然后用总数减