【蓝桥杯3536】矩形总面积(模拟&规律&java)

文章讨论了解决如何在考虑坐标边界的情况下,高效计算两个矩形重叠部分的面积,避免数组范围限制,通过边界转换和边界关系分析给出解决方案。
摘要由CSDN通过智能技术生成

问题描述

输入输出

 

解题思路

首先看到这道模拟题竟然下意识地想到用二维数组去模拟面积点,遍历后若占有则标记,若标记两次则为重叠区域。但是很快就否定了这个想法,因为面积可能会很大,甚至超出所能开辟的数组范围,而且坐标有四个象限,有正负。当然,正负可以通过同时加上最小值的绝对值来解决,毕竟挪个位置面积是不变的。

最终的方法就是通过画图找规律得出的,通过分析两个矩形的边界关系得出以下结论,可以求得矩形重叠部分。

 

 既然上面的做法是在讨论边界,那么就要对题目的输入——点的坐标,转化一下变成边界。

注意:数据类型要用long,因为根据题目说明的数据大小,相乘后可能会超出int能表示的最大范围(int最大值略大于10的9次方)。

 

AC代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		// 读入上下右左边界
		long l1 = scan.nextInt();
		long d1 = scan.nextInt();
		long r1 = scan.nextInt();
		long u1 = scan.nextInt();
		long l2 = scan.nextInt();
		long d2 = scan.nextInt();
		long r2 = scan.nextInt();
		long u2 = scan.nextInt();

		// 计算两个矩阵面积
		long area1 = (r1 - l1) * (u1 - d1);
		long area2 = (r2 - l2) * (u2 - d2);

		// 计算最右左边界、最左右边界、最下上边界、最上下边界
		long ll = Math.max(l1, l2);
		long rr = Math.min(r1, r2);
		long uu = Math.min(u1, u2);
		long dd = Math.max(d1, d2);

		// 判断不相交的情况
		if (ll > rr || uu < dd) {
			System.out.println(area1 + area2);
		} else {// 减去重叠部分
			System.out.println(area1 + area2 - (rr - ll) * (uu - dd));
		}
	}
}

(by 归忆)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归忆_AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值