C语言数组题_校门外的树_标记法

博客围绕计算马路上移走建地铁区域的树后剩余树的数量展开。题目给出马路长度及种树规则,还有建地铁区域的起始和终止点。解题思路从复杂的重合情况处理转变为用标记法,先建数组元素为‘1’,将建设区域值改为‘0’,最后给出代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是11米。我们可以把马路看成一个数轴,马路的一端在数轴00的位置,另一端在LL的位置;数轴上的每个整数点,即0,1,2,…,L0,1,2,…,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

解题思路

刚一看题目,觉得这个数组的题重点考察重合部分的处理,以两个修建区域为例,无外乎三种情况1:两个不重合;2:两个重合(一个包含在另一个里);3:部分重合。起初以为单纯的把每种情况列出来相加再减去重合部分的树的数目就可以完成,但是这样非常复杂。

此题最佳的做法是用标记法,即先建立一个数组,令其所有元素为‘1’,将每一个建设区域内的值修改为‘0’,这样即使重合的部分也不用担心会多减去树。

代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int l,m,count=0,i,j;
    int a[101][2],lu[10001]={'\0'};		//a储存所有区域的始末位置; lu储存马路上的树的位置
    scanf("%d %d",&l,&m);
    for(i=0;i<l+1;i++)
        lu[i]=1;							//l为马路长度,每棵树距离1米,树的个数为l+1,这里将所有树的位置标记为‘1’
    for(i=0;i<m;i++)
    {
        scanf("%d %d",&a[i][0],&a[i][1]); 		//对m个区域的始末位置赋值
    }
    for(i=0;i<m;i++)
    {
        for(j=a[i][0];j<=a[i][1];j++)
        {
            lu[j]=0;							//将每个区域的所在路的区间的值覆盖为‘0’,表示此段路被用作建设
        }
    }
    for(i=0;i<l+1;i++)
        if(lu[i]==1)
            count++; 			//遍历lu,记录'1'的个数,即未被占用的树的数目
    printf("%d",count);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值