查看完整题目和答题点此前往
首先分析题目,提取关键信息:
- 长度为 𝑙 的马路上有一排树
- 每两颗相邻的树间隔都是1米
- 看成𝑙 长度的数轴,数轴上的每个整数点都是一棵树,包括0和𝑙
- 马路上有一些区域要用来建地铁
- 区域用它们在数轴上的起始点和终止点表示
- 任一区域的起始点和终止点的坐标都是整数
- 区域之间可能有重合的部分
- 求把这些区域中的树(包括区域端点处的两棵树)移走后,马路上还有多少棵树。
然后分析输入输出格式:
- 输入第一行有两个整数,分别表示马路的长度 𝑙和区域的数目 𝑚。
- 接下来 𝑚行,每行两个整数 𝑢,𝑣表示一个区域的起始点和终止点的坐标。
- 输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。
由上面分析可知
- 需要定义两个整数分别保存路的长度,和区域的数目。
- 因为是多次输入,所以可以使用循环分别对每次输入进行处理,循环次数为区域数目。
- 然后需要两个整数负责在数组里面接收每次输入的区域起始点和终点。可以定义在数组外边,避免每次循环都执行定义操作。
- 最后是怎么操作数据可以满足题目要求。
- 因为有区域重合,所以如果进行切割区域的话比较麻烦,最简单的就是每次把区域的所有数去掉。最后统计没有还存在的数。
- 可以定义一个数组,长度则是输入的 𝑙。因为是输入的 𝑙,所以数组定义在 𝑙的输入后面。而且我们只需要表示存在和不存在两种状态,所以可以直接定义一个boolean类型的数组。因为boolean类型的数组,值只有true和false。而且不需要初始化,因为系统会默认初始化为false。
- 然后在循环里面根据每次输入的区域起始点和终点,循环把对应的数组值赋值成true。
- 最后再统计数组中值为false的元素个数即可得出路上剩余的树木数量。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int l=s.nextInt()+1;//树的数量=路的长度+1(因为要算0)
byte m=s.nextByte();//题目说m的值是1≤m≤100,所以可以使用byte节省空间
int u,v,n=0;
boolean[] sum=new boolean[l];//默认值为false,不影响使用
for(byte i=0;i<m;i++){
u=s.nextInt();
v=s.nextInt();
for(int j=u;j<=v;j++){
sum[j]=true;//换一个值表示树被移走了
}
}
for (int i=0;i<l;i++){
if(sum[i]==false)//还是默认值的树则没有被移走
n++;
}
System.out.println(n);
}
}
注意: 因为包括0,所以输入的长度需要加1。(比如输入3,则有0,1,2,3一共四棵树。)