解题思路:
建立一个数组来保存数轴上的树的状态,另一个二维数组来保存每次输入的区域,在输入输入的区域的同时,改变信号值的状态,最终遍历数组来统计所有的未改变的值的个数.
注意事项:
数组的定义要比L值多一个,因为0也为有效值.
参考代码:
/* 题目描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
500 3
150 300
100 200
470 471
样例输出
298 */
#include<stdio.h>
int main(){
int l,m,count=0;
int i,j;
scanf ("%d",&l);
scanf ("%d",&m);
int a[l+1],b[m][2]; //定义一个长度为l+1(包括0坐标)的数组来表示坐标轴,和一个m行2列的二维数组来存储没一个区域的起始结束位置.
for(i=0;i<=l;i++){
a[i]=1; //每一个数组元素中存有这棵树的状态,初始都存在,用1来表示
}
for (i=0;i<m;i++){
scanf ("%d",&b[m][0]);
scanf ("%d",&b[m][1]);
for (j=b[m][0];j<=b[m][1];j++){
a[j]=0; //读入一块区域的同时给这块区域砍树,被砍了的坐标变为0;
} //用状态值来表示避免了计算重复区域的麻烦,已赋值0的还是赋值0
}
for(i=0;i<=l;i++){
if (a[i]==1){
count++; //统计没被砍的树(值为1)
}
}
printf ("%d",count);
return 0;
}
0.0分
0 人评分
C二级辅导-等差数列 (C语言代码)浏览:1315 |
永远的丰碑 (C语言代码)浏览:698 |
C语言程序设计教程(第三版)课后习题8.1 (Java代码)浏览:828 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:690 |
简单的a+b (C语言代码)浏览:583 |
简单的a+b (C语言代码)浏览:719 |
简单的a+b (C语言代码)浏览:564 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:484 |
WU-图形输出 (C++代码)浏览:836 |
C语言程序设计教程(第三版)课后习题6.6 (C++代码)浏览:649 |