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

题目描述

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

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

解题思路

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

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

代码

#include 
#include 

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);

}

你可能感兴趣的:(C/C++,c语言,数组,校门外的树)