Free Pascal《校门外的树》

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是一米,我们可以把马路看成一个数轴,马路的一端在零的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2... 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是一米,我们可以把马路看成一个数轴,马路的一端在零的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2……L,都种有一棵树。
由于马路上有一些区域要用来修地铁,这些区域用他们在数轴上的起始点和终止点表示。已知任意区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。
输入的第一行有两个整数L(1<=L<=10000),和M(1<=M<=100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
展开
 我来答
士芮安08
2010-08-07 · TA获得超过3万个赞
知道大有可为答主
回答量:5449
采纳率:40%
帮助的人:1141万
展开全部
/*本题的思想是用一个一维数组来存放马路各位置点当前的状态:假设1代表当前位置的状态为有树,用0来表示当前位置的状态为地铁,根据题目所给的地铁区域,可以将对应的状态区域置0,最后当置0完题目所给的所有地铁段时,再重新对整条公路的状态遍历一遍,用一个记数变量记录状态为1的个数,即为所求。*/
#include <stdio.h>
int main()
{
FILE *fp1,*fp2;
int L,m;
int num[10001];//用一个数组表示这条公路上对应点的状态 ,考虑为什么长度不是10000
int i,j,Nontrees;
int s1,e1;
if((fp1=fopen("tree0.in","r"))==NULL)
{
printf("cannot open file\n");
return 0;
}
fscanf(fp1,"%d%d",&L,&m);//L代表马路长度,m代表区域数目

for(i=0;i<=L;i++)//首先假设长度为L的公路上栽满树;用1表示当前位置有树
num[i]=1; //考虑一下为什么不是i<L,而是i<=L

for(i=0;i<m;i++) //外循环控制地铁的区域数
{
fscanf(fp1,"%d%d",&s1,&e1); //获取每段地铁区域的上界和下界
for(j=s1;j<=e1;j++) //内循环实现将各段地铁区域置0,表示当前位置是铺设地铁的
{
num[j]=0;
}
}

for(i=0;i<=L;i++) //重新遍历整条公路的状态,记录下树点的个数,即状态为1的点的个数
{
if(num[i]==1)
Nontrees++;
}

if((fp2=fopen("tree0.out","w"))==NULL)
{
printf("cannot open file\n");
return 0;
}
fprintf(fp2,"%d",Nontrees); //输出结果
fclose(fp1);
fclose(fp2);
return 0;

}

参考资料: http://www.gzkg.net/news/show.aspx?id=1356&cid=128

huangyuemp3
2010-08-07 · TA获得超过318个赞
知道答主
回答量:243
采纳率:0%
帮助的人:0
展开全部
var
tree:array[0..10000] of boolean;
i,j,l,m,a,b,s:longint;
begin
readln(l,m);
for i:=0 to l do tree[i]:=true; //初始化全部的树都还在
for i:=1 to m do
begin
readln(a,b); //读入起始点和终止点的坐标
for j:=a to b do tree[j]:=false; //从起始点到终止点的树都被移走
end;
s:=0;
for i:=0 to l do if tree[i]=true then s:=s+1;
//如果这棵树还在,就把s+1
writeln(s); //输出剩余的树的树木
end.

【注意:此代码为伪代码,没有编译过,是直接打出来的,不确定是否正确。请在编译器那里编译通过后,测几组数据再使用!】
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
皮悠果孤伙17
2010-08-07
知道答主
回答量:15
采纳率:0%
帮助的人:0
展开全部
var
i,n,k,l,x,y:longint;
s,e:array[0..10000] of longint;
begin
readln(n,k);
for i:=1 to k do begin
readln(x,y);
inc(s[x]);inc(e[y]);
end;
l:=0;k:=0;
for i:=0 to n do begin
l:=l+s[i]-e[i];
if (l=0) and (e[i]=0) then inc(k);
end;
writeln(k);
end.

已AC.
附注解:s,e,两数组分别表示马路长度为i时开始的区间数和结束的区间数。如果l=0,同时e[i]也是0,则可说明这个长度上没有植树。(如果e[i]<>0,那么这个区间还是种了树)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式