点击查看:蓝桥杯历年真题 题解目录
油漆面积
思路:
1. 这道题用线段树去写,可以得到很大的优化
2. 将面积分成相应的小方格,去计数,也能得到结果
3. 用小方格计数时,将存储油漆的区域用 boolean 类型记录,否则会超内存
4. 无论用普通解法(我试了n种),还是线段树树解法,还是C++ 解法,
包括官网给的代码,"都不能通过第一个样例。(我已向蓝桥官网反馈)"
我怀疑是:系统数据上传错误。
5. 下文提供 2段代码,系统规定 用时 < 2000 ms ,内存 < 256 MB
第一段代码,在数组大小和空间上进行了优化, 用时 359ms 内存 143.7 MB
第二段代码,直接暴力在数组类型为Boolean在空间上进行了优化,用时 1.046ms,内存 157.4MB
package java_A_2017;
import java.util.Scanner;
public class Main010_油漆面积 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n =in.nextInt();
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int[][]a = new int[n][4];
for(int i=0;i<n;i++) {
for(int j=0;j<4;j++) {
a[i][j]=in.nextInt();
if(a[i][j]>max) max=a[i][j];
if(a[i][j]<min) min=a[i][j];
}
}
int [][]t = new int[max-min+1][max-min+1];
for(int i=0;i<n;i++)
for(int k1=a[i][0]-min;k1<a[i][2]-min;k1++)
for(int k2=a[i][1]-min;k2<a[i][3]-min;k2++)
t[k1][k2]=1;
long count = 0;
for(int i=0,m=t.length;i<m;i++)
for(int j=0,m2=t[0].length;j<m2;j++)
if(t[i][j]==1) count++;
System.out.println(count);
}
}
package java_A_2017;
import java.util.Scanner;
public class Main010_油漆面积2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n =in.nextInt();
int[][]a = new int[n][4];
boolean[][]t = new boolean[10001][10001];
for(int i=0;i<n;i++) {
a[i][0]=in.nextInt();
a[i][1]=in.nextInt();
a[i][2]=in.nextInt();
a[i][3]=in.nextInt();
for(int k=a[i][0];k<a[i][2];k++)
for(int h=a[i][1];h<a[i][3];h++)
t[k][h]=true;
}
long count=0;
for(int i=0;i<10000;i++)
for(int j=0;j<10000;j++)
if(t[i][j]==true) count++;
System.out.println(count);
}
}