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