蓝桥杯2023省赛:矩阵总面积|模拟、数学(几何)

2024-03-22 01:44

本文主要是介绍蓝桥杯2023省赛:矩阵总面积|模拟、数学(几何),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:

0矩形总面积 - 蓝桥云课 (lanqiao.cn)

说明:

参考文章:矩形总面积计算器:计算两个矩形的总面积,包括重叠区域_矩形r1的左下角坐标为x1, yl 、宽度为w1、高度为h1, 矩形r2的左下角坐标为x2,y2、宽-CSDN博客

看似简单,实际如果一种一种列举情况写if-else还挺麻烦的。首先很容易看出的是,两矩形不相交的情况:

x[4]<=x[1]||x[3]>=x[2]||y[3]>=y[2]||y[4]<=y[1]

以及一者包含另一者的情况:x[3]>=x[1]&&x[4]<=x[2]&&y[3]>=y[1]&&y[4]<=y[2]、x[3]<=x[1]&&x[4]>=x[2]&&y[3]<=y[1]&&y[4]>=y[2]

但是两者相交的情况,如果要用列举出来,情况非常多,至少以下这么多种情况(黑色为R1,其他颜色为R2):

所以需要考虑找规律。

按照参考文章的思路,我们需要找到高效率确定重叠区域的方法,二维图形不好想象,首先从两条直线来考虑重叠区域:

由图可知,右边界是两条直线右边界的较小值,左边界是两条直线左边界的较大值,在两个矩形的重叠区域的x方向上也是满足的。如果没有重叠区域,那么找出的左边界将会大于右边界。

由这个方法也可以找到y方向上的上下边界,由此就可以计算出重叠区域的面积,但要判断一下区域是否存在(也就是判断边界差值是否大于0)。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e9;
int ans = 0;
int x[5],y[5]; signed main() {cin.tie(0);cout.tie(0);for(int i=1;i<5;i++){cin>>x[i]>>y[i];}int s1=(y[4]-y[3])*(x[4]-x[3]),s2=(y[2]-y[1])*(x[2]-x[1]);int l,r;l=min(x[2],x[4])-max(x[1],x[3]) ;r=min(y[2],y[4])-max(y[1],y[3]);if(l>0&&r>0){ans=s1+s2-l*r;}else{ans=s1+s2;}cout << ans;return 0;
}

这篇关于蓝桥杯2023省赛:矩阵总面积|模拟、数学(几何)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834280

相关文章

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=