考研机试 25.剩下的树

时间:2021/03/06

一.题目描述

有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。     现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。     可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。

输入描述

两个整数L(1<=L<=10000)和M(1<=M<=100)。
接下来有M组整数,每组有一对数字。

输出描述

可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。

题目链接

https://www.nowcoder.com/practice/f5787c69f5cf41499ba4706bc93700a2?tpId=40&tqId=21356&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

二.算法

题解

建立一个数组存储树,有树时相应下标数组元素为0,然后遍历移走树,即设置为-1,这里使用的时Arrays.fill算法,要注意该方法填充数组时是前闭后开,所以后面的下标要加1。

重点

Arrays类的fill方法在填充数组时是前闭后开的。

代码

import java.util.Scanner;
import java.util.Arrays;

public class Main{
    
    public static void main(String[] args){
        
        Scanner in = new Scanner(System.in);
        
        //读取输入
        int l = in.nextInt();
        int m = in.nextInt();
        int[] counts = new int[l + 1];
        int[] starts = new int[m];
        int[] ends = new int[m];
        for(int i = 0; i < m; i++){
            starts[i] = in.nextInt();
            ends[i] = in.nextInt();
        }
        
        //移走数
        for(int i = 0; i < m; i++){
            Arrays.fill(counts, starts[i], ends[i] + 1, -1);
        }
        
        //计算剩余树的数量
        int count = 0;
        for(int i = 0; i < l + 1; i++){
            if(counts[i] == 0){
                count++;
            }
        }
        
        System.out.println(count);
    }
}
原文地址:https://www.cnblogs.com/machi12/p/14491310.html