讨论 / 伪码题解
elf465504453 2011-04-22 05:11:00
点我顶贴 收藏 删除
很多人连样例都通不过,自己的程序结果明明是297题目却给了298,其实这都是平时习惯以及为认真审题所致。

此题首选解法数组,原因自明。

阅读题目第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

结束

#1 崛起@2011-04-14 00:26:00
回复 删除
讲的很精彩 看的我很无语 MS你只要说0点有意义即可

不管怎样 感谢楼主花心思写题解

#2 崛起@2011-04-14 00:30:00
回复 删除
来晒晒代码 呵~

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.

#3 elf465504453@2011-04-14 03:28:00
回复 删除
回复 沙发崛起 的帖子

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;

}

#4 崛起@2011-04-14 18:10:00
回复 删除
囧 既然0无意义 为何要对0进行统计?

i=0

while(i小于等于l){

if(road[下标i]等于1) 那么 sum=sum+1

i=i+1 //i小于等于l是为了检测到下标为l的树

}

输出sum

#5 elf465504453@2011-04-22 05:11:00
回复 删除
回复 地板崛起 的帖子

这个i是序号,然后我只是检测如果一个元素的值等于一,就让总数目加一。

查看更多回复
提交回复