重叠的装饰

重叠的装饰

题目描述:
我们部门需要装饰墙,但是墙非常非常的长,有一千万米。我们会按顺序贴很多海报在上面,这些海报相互之间会重叠,请问下,最后还能看到哪些?(只看到一部分也算)

输入描述:
N表示N张海报
接下来每一行代表海报的左右边界(上下默认全满),Li,Ri,均为整数,大于0,小于一千万。海报按输入顺序张贴。

输出描述:
有多少张海报是可见的

示例1
输入
5
1 4
2 6
8 10
3 4
7 10

输出
4
思路:创建一个长度为10000001的数组T[],初始化赋值为-1,然后每输入一个区间[Li,Ri],就以对数组T[]的区间[Li,Ri]进行标记,标记号一次累加,例如:区间[1,4],就将T[]中的[1,4]区间元素置为1,区间[2,6],就在T[]中的[2,6]区间元素置为2。。。。。。。这样以来,报纸被遮挡的部分,数字也会被遮挡,接下来就是遍历数组T[]中有多少个不同的元素(遇见-1就continue),我是利用Set容器,将T[]中的放入Set容器,最后容器里面的元素个数,就是我们能看到的海报张数。

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);//输入
        Set <Integer> set = new HashSet<>();//定义Set容器
        int T[]= new int[10000001];
        Arrays.fill(T,-1);//将T数组元素全部置-1
        int n = in.nextInt();//输入海报张数
        int [][]arr = new int[n][2];//定义二维数组
        for(int i=0;i<n;i++){
            arr[i][0]=in.nextInt();
            arr[i][1]=in.nextInt();
        }
        for(int i=0;i<n;i++){//对T[]进行标记
            for(int j=arr[i][0];j<=arr[i][1];j++){
                T[j]=i;
            }
        }
        for(int i=0;i<10000001;i++){
            if(T[i]==-1) continue;
            set.add(T[i]);
        }
        System.out.println(set.size());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值