我们部门需要装饰墙,但是墙非常非常的长,有一千万米。我们会按顺序贴很多海报在上面,这些海报相互之间会重叠,请问下,最后还能看到哪些?(只看到一部分也算)
N表示N张海报
接下来每一行代表海报的左右边界(上下默认全满),Li,Ri,均为整数,大于0,小于一千万。海报按输入顺序张贴。
有多少张海报是可见的
5 1 4 2 6 8 10 3 4 7 10
4
import java.util.*;
public class Main {
public static void main(String args[]) {
int min = Integer.MAX_VALUE;
int max = -1;
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] temp = new int[10000001];
for(int i = 1; i <= N; i++) {
int Li = in.nextInt();
int Ri = in.nextInt();
min = Math.min(Li,Ri);
max = Math.max(Ri,Li);
for(int j = min; j <= max; j++) {
temp[j] = i;
}
}
Set<Integer> set = new HashSet<>();
for(int i = 0; i < temp.length; i++) {
if(temp[i] != 0)
set.add(temp[i]);
}
System.out.println(set.size());
}
} //复杂度过大,不能全部通过,有人改进一下吗
import java.util.Arrays;
import java.util.Scanner;
//50
public class Main {
static int max = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Info[] arr = new Info[n];
for(int i=0;i<n;i++){
Info info = new Info();
info.a = sc.nextInt();
info.b = sc.nextInt();
arr[i] = info;
if(Math.max(info.a,info.b)>max){
max = Math.max(info.a,info.b);
}
}
int res = 0;
for(int i=0;i<arr.length-1;i++){ //最后一个必然不能被覆盖
if(!isCover(arr, i)){
res++;
}
}
System.out.println(res+1);
}
static class Info{
public int a,b;
}
static boolean isCover(Info[] arr,int a){
int[] temp = new int[max+1];
for(int i=a+1;i<arr.length;i++){
Arrays.fill(temp,Math.min(arr[i].a, arr[i].b),Math.max(arr[i].a, arr[i].b)+1,10);
}
boolean res = true;
for(int i=arr[a].a;i<=arr[a].b;i++){
if(temp[i] != 10){
res = false;
break;
}
}
return res;
}
}