蓝桥杯第八届真题 :油漆面积

点击查看:蓝桥杯历年真题 题解目录
油漆面积

在这里插入图片描述

在这里插入图片描述

思路:
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);
   }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值