此题首选解法数组,原因自明。
阅读题目第2-3行,关键信息是“马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。”,因此如果使用数组,那么下标0和下标L的位置都是有一棵树的。
很多时候会用这样的代码(伪代),假设我们将数组中有树的位置设为1,没有的设为0,:
定义数组road[10000个元素,所有项均为0]
声明整数i
i=0
while(i<l) //l为题目给的,马路长度
{road[i]=1
i=i+1
}
这样做的结果就是有l个项被赋值为1,意为有l棵树。但是:请注意题目信息“0,1,2,……,L,都种有一棵树”。
因此,事实上,我们少种了一棵树,即下标为l的那棵。
故开头正确赋值语句为:
定义数组road[10000个元素,所有项均为0]
声明整数i
i=0
while(i小于等于l) //l为题目给的,马路长度
{road[i]=1
i=i+1
}
这样的赋值才满足要求,之后就简单了,只把伪代码贴出来
开始
定义整形数组road[10000个元素,所有项均为0]
声明整数i,m,start,end,sum
输入l,m
i=0
while(i小于等于l) //l为题目给的,马路长度
{road[i]=1
i=i+1
} //有树的位置均为1
i=0
while(i<m){
输入start,end //开头结尾坐标
while(start小于等于end){
road[下标start]=0 //砍去树
start=start+1
}
}
sum=0 //sum为最后剩余树木数
i=0
while(i小于等于l){
if(road[下标i]等于1) 那么 sum=sum+1
i=i+1 //i小于等于l是为了检测到下标为l的树
}
输出sum
结束
program R13;
const maxn=10000;
var a,b,s,l,i,j,k,m,n:longint;
f:array[0..maxn]of boolean;
begin
readln(l,m);
for i:=1 to m do
begin
readln(a,b);
for j:=a to b do f[j]:=true;
end;
for i:=0 to l do if not f[i] then inc(s);
writeln(s);
end.
0点我设置的是无意义,谢谢!
另外我使用的是C语言,没有PASCAL中的布尔变量,因此只能用0或1来表示。可能会和你的有出入。我的代码:
#include<stdio.h>/*13*/
int main()
{
long l,m,road[10000]={0},i,start,end,sum;
scanf("%ld%ld",&l,&m);
for(i=0;i<=l;i++)road[i]=1;
for(i=0;i<m;i++){
scanf("%ld%ld",&start,&end);
for(;start<=end;start++)road[start]=0;
}
for(sum=0,i=0;i<=l;i++)if(road[i]==1)sum+=1;
printf("%ld",sum);
return 0;
}
i=0
while(i小于等于l){
if(road[下标i]等于1) 那么 sum=sum+1
i=i+1 //i小于等于l是为了检测到下标为l的树
}
输出sum