2023年蓝桥杯省赛——矩形面积总和

news2024/11/14 6:23:22

目录

题目链接: 1.矩形总面积 - 蓝桥云课 (lanqiao.cn)

思路

暴力

数学杯思路

数学逻辑 

难点之重合区域

代码实现

总结


题目链接: 1.矩形总面积 - 蓝桥云课 (lanqiao.cn)

思路

暴力

        开幕雷击,我直接开始暴力,但是我暴力到一半,发现暴力的方法如果要把全部的矩形分布情况都包含进去的话,真的太多了,太长了,太臭了。随即我意识到蓝桥杯其实是数学杯,wori,我来看看。

        下面是的暴力到一半的代码,我知道暴力不出来了,就直接先截断很多情况没有考虑,直接赶紧搞定就输出了。而且这里的面积处理虽然是对的但是处理的太复杂了。 

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 接收参数
        // 矩形 1 左下角 ↙
        long zx1_x = scanner.nextInt();
        long zx1_y = scanner.nextInt();
        // 矩形 1 右上角 ↗
        long ys1_x = scanner.nextInt();
        long ys1_y = scanner.nextInt();
        // 矩形 1 左上角 ↖
        long zs1_x = zx1_x;
        long zs1_y = ys1_y;
        // 矩形 1 右下角 ↘
        long yx1_x = ys1_x;
        long yx1_y = zx1_y;

        // 矩形 2 左下角 ↙
        long zx2_x = scanner.nextInt();
        long zx2_y = scanner.nextInt();
        // 矩形 2 右上角 ↗
        long ys2_x = scanner.nextInt();
        long ys2_y = scanner.nextInt();
        // 矩形 2 左上角 ↖
        long zs2_x = zx2_x;
        long zs2_y = ys2_y;
        // 矩形 2 右下角 ↘
        long yx2_x = ys2_x;
        long yx2_y = zx2_y;

        
        // 判断两个矩形摆放的位置的类型
        long s = 0;
        if ((zx1_x >= zx2_x && zx1_y >= zx2_y)||(zx1_x <= zx2_x && zx1_y <= zx2_y)) {
            // 是↗ or ↙摆的
            if (zx1_x < zx2_x) {
                // ↗
                long sAll = (ys2_y - yx1_y)*(ys2_x - yx1_x);
                long s1 = (yx2_y - yx1_y)*(yx2_x - yx1_x);
                long s2 = (zs2_y - zs1_y)*(zs2_x - zs1_x);
                s = sAll - s1 - s2;
            }else if (zx1_x > zx2_x) {
                // ↙
                long sAll = (ys1_y - yx2_y)*(ys1_x - yx2_x);
                long s1 = (yx1_y - yx2_y)*(yx1_x - yx2_x);
                long s2 = (zs1_y - zs2_y)*(zs1_x - zs2_x);
                s = sAll - s1 - s2;
            }
        }else {
            // 是↖ or ↘摆的
            if (zx1_x < zx2_x) {
                // ↘
                long sAll = Math.abs((zs1_y - yx2_y)*(zs1_x - yx2_x));
                long s1 = Math.abs((zx1_y - zx2_y)*(zx1_x - zx2_x));
                long s2 = Math.abs((ys1_y - ys2_y)*(ys1_x - ys2_x));
                s = sAll - s1 - s2;
            }else if (zx1_x > zx2_x) {
                // ↖
                long sAll = Math.abs((zs2_y - yx1_y)*(zs2_x - yx1_x));
                long s1 = Math.abs((zx2_y - zx1_y)*(zx2_x - zx1_x));
                long s2 = Math.abs((ys2_y - ys1_y)*(ys2_x - ys1_x));
                s = sAll - s1 - s2;
            }
        }
        System.out.println(s);
    }
}

直接裂开,头脑简单,四肢发达

数学杯思路

蓝桥杯,什么蓝桥杯,这个就是数学杯!!!!!!!!!!!

写蓝桥杯的题,写别慌写,先研究他的数学逻辑!!!!!!!!!!!!!!!

数学逻辑 

在研究这道题之前,我们先研究这道题的数学逻辑。

如果我问你:

        现在我有两个矩形,可能重合可能不重合,也可能部分相交,我会给你这两个矩形的左下角和右上角的坐标,如果我想用java代码求得这两个矩形覆盖的面积,重合部分只计算一次,你怎么做。

你可以答:

  1. 计算两个矩形各自的面积。首先,我们需要找到每个矩形的宽度和高度,这可以通过简单地将右上角的坐标减去左下角的坐标得出。然后,我们通过将宽度和高度相乘得出每个矩形的面积。

  2. 找出重叠区域的坐标。首先,我们需要找到重叠区域的左下角和右上角的坐标左下角坐标是两个矩阵左下角点的最大坐标右上角坐标是两个矩阵右上角点的最小坐标

  3. 计算重叠区域的面积。使用和第一步相同的方法,得出重叠区域的面积。

  4. 最后,我们通过将第一步得到的两个矩形的面积相加,然后减去第三步得到的重叠区域的面积,就可以得到两个矩形覆盖的总面积。因为重叠区域被计算了两次,所以我们需要将它从总面积中减去。

难点之重合区域

再问这个重叠区域的坐标是怎么找到的?

答:

  1. 左下角的坐标是这样找的:对于x坐标,我们比较两个矩形左下角的x坐标,取较大的那个;对于y坐标,我们比较两个矩形左下角的y坐标,也是取较大的那个。于是,我们得到的新的坐标点就是重叠区域左下角的坐标。

  2. 右上角的坐标是这样找的:对于x坐标,我们比较两个矩形右上角的x坐标,取较小的那个;对于y坐标,我们比较两个矩形右上角的y坐标,取较小的那个。得到的新的坐标点就是重叠区域右上角的坐标。

  3. 如果这样得到的重叠区域的左下角坐标比右上角对应的坐标大(也就是形成了一个“矩形”宽度或者高度小于0),我们就认为两个矩形没有重叠区域,此时可以直接将重叠区域的面积设为0。

这个逻辑大家稍微画一个图来理解一下就可以很清楚的懂了。

代码实现



import java.util.Scanner;

// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		// 接收参数
		// 矩形 1 左下角 ↙
		long zx1_x = scanner.nextInt();
		long zx1_y = scanner.nextInt();
		// 矩形 1 右上角 ↗
		long ys1_x = scanner.nextInt();
		long ys1_y = scanner.nextInt();

		// 矩形 2 左下角 ↙
		long zx2_x = scanner.nextInt();
		long zx2_y = scanner.nextInt();
		// 矩形 2 右上角 ↗
		long ys2_x = scanner.nextInt();
		long ys2_y = scanner.nextInt();

		
		// 分别计算两个矩形的面积
		long s1 = (ys1_y - zx1_y)*(ys1_x - zx1_x);
		long s2 = (ys2_y - zx2_y)*(ys2_x - zx2_x);
		
		// 计算重合部分的面积
		// 重合部分的左下角是大的那一个 x1 y1
		long x1 = Math.max(zx1_x, zx2_x);
		long y1 = Math.max(zx1_y, zx2_y);
		// 重合部分的右上角是小的那一个 x2 y2
		long x2 = Math.min(ys1_x, ys2_x);
		long y2 = Math.min(ys1_y, ys2_y);
		
		
		if (y2 - y1 < 0 || x2 - x1 < 0) {
			// 判断是否有重合的部分,这种情况就是没有重合的部分
			System.out.println(s1 + s2);
		}else {
			// 有重合的部分
			long sc = (y2 - y1)*(x2 - x1);
			System.out.println(s1 + s2 - sc);
		}	
	}
}

总结

这不是蓝桥杯,这是

数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯

记住了兄弟们,我也是服啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1551863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析RSA算法原理及其安全性机制

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、RSA算法简介二、RSA算法原理2.1 背景与数学基础2.2 密钥生成2.3 加密过程2.4 解密过程 三、安全性考虑四、RSA的使用五、…

【Linux】详解进程程序替换

一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例程开始执…

爱上数据结构:顺序表和链表

一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条…

iOS - LLVM的中间代码(IR)

文章目录 iOS - LLVM的中间代码&#xff08;IR&#xff09;1. 转为汇编代码2. 中间代码&#xff08;IR&#xff09;2.1 Objective-C在变为机器代码之前&#xff0c;会被LLVM编译器转换为中间代码&#xff08;Intermediate Representation&#xff09;2.2 可以使用以下命令行指令…

MySQL 索引:索引为什么使用 B+树?

Hash 索引不支持顺序和范围查询&#xff1b; 二叉查找树(BST)&#xff1a;解决了排序的问题&#xff0c;极端情况下可能会退化成线性链表&#xff0c;查询效率急剧下降&#xff1b; 平衡二叉树(AVL) &#xff1a;通过旋转解决了平衡的问题&#xff0c;但是旋转操作效率太低&am…

蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)

目录 一、摆花 思路一&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 思路二&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 循环遍历&#xff1a; 状态转移方程&#xff1a; 二、数字三角形加强版 一、摆花 题目描述 小明的花店新开张&#xff0c;为了吸…

spring boot3自定义注解+拦截器+Redis实现高并发接口限流

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 内容简介 实现思路 实现步骤 1.自定义限流注解 2.编写限流拦截器 3.注册拦截器 4.接口限流测试 写在前…

戴尔电脑Dell SupportAssist占用内存高,卸载Dell SupportAssist

咨询戴尔客服了解到&#xff0c;SupportAssist是机器出厂自带的一款应用&#xff0c;主要的功能是可以检查驱动更新以及做一些硬件方面的健康检测&#xff0c;有时候后台运行可能会导致进程占用内存比较大&#xff0c;导致访问被的应用崩溃。 咨询卸载不影响之后&#xff0c;然…

在CentOS7上部署Nginx并测试指南

Nginx部署测试 Nginx简介 Nginx是俄罗斯人Igor Sysoev编写的一款高性能的HTTP和反向代理服务器。 Nginx选择了epoll和kqueue作为网络I/O模型&#xff0c;在高连接并发的情况下&#xff0c;内存、CPU等系统资源消耗非常低&#xff0c;运行稳定。 正向代理与反向代理 正向代…

FLStudio多少钱FL Studio中文版软件序列号-激活码购买

fl studio是一款编曲软件&#xff0c;接触这款软件的大多都是做音乐的小伙伴吧&#xff0c;对于初学者想了解这款软件在意的应该就是它的价格。很多打算入手正版FL Studio的新手朋友都会纠结一个问题&#xff1a;哪个版本的FL Studio更适合我&#xff0c;到底应该入手哪一款FL …

Java安全篇-Fastjson漏洞

前言知识&#xff1a; 一、json 概念&#xff1a; json全称是JavaScript object notation。即JavaScript对象标记法&#xff0c;使用键值对进行信息的存储。 格式&#xff1a; {"name":"wenda","age":21,} 作用&#xff1a; JSON 可以作为…

OCP NVME SSD规范解读-15.DSSD set feature功能要求-2

启用IEEE1667隔离区(Enable IEEE1667 Silo)&#xff1a;特征标识符C4h允许开启符合IEEE1667标准的安全存储区功能&#xff0c;以实现数据的隔离和安全存储。 4.15.9章节描述了启用IEEE1667 Silo&#xff08;通过Feature Identifier C4h标识的Set Feature命令&#xff09;的相关…

C++:转义符(10)

在c中有一些字符无法被显示出来&#xff0c;所以需要使用些特殊字符加字母来展示 可以看到基本都是一个\加一个字母去只执行对应的一个效果 这里我选择几个对于当前来说比较重要的&#xff1a;\n &#xff0c;\\ &#xff0c;\t \n换行符 可以看到在c语言中他就是一个可以换行…

echarts图表动态监听dataZoom滑动,控制柱条的宽度以及数值的显示隐藏

当数值过多时&#xff0c;显示所有柱条看着会很凌乱且文字会挤在一起&#xff0c;于是就需要监听datazoom的滑动&#xff0c;拿到对应的阈值后做出相应的配置。 “dataZoom” 事件通常用于响应用户对图表进行数据缩放的操作。 这里是datazoom官网api地址&#xff1a;点击跳转至…

【计算机网络篇】数据链路层(4.1)可靠传输的相关概念

文章目录 &#x1f354;可靠传输的相关概念⭐分组丢失⭐分组失序⭐分组重复 &#x1f95a;注意 &#x1f354;可靠传输的相关概念 使用差错检测技术&#xff08;例如循环冗余校验CRC&#xff09;&#xff0c;接收方的数据链路层就可以检测出帧在传输过程中是否产生了误码&…

基于SpringBoot后端实现连接MySQL数据库并存贮数据

目录 一、什么是MySQL数据库 二、基于SpringBoot框架连接MySQL数据库 1、首先添加MySQL依赖&#xff1a; 2、配置数据库连接&#xff1a; 3、创建实体类&#xff1a; 4、创建Repository接口&#xff1a; 5、使用Repository&#xff1a; 三、编写业务SQL语句 1、使用Spring Data…

大模型LLM的数学推理

1 算术 例如: 2 数学文字题 2.1 问题-答案 直接给出答案 2.2 问题-方程式-答案 给出解答的方程式&#xff08;过程&#xff09; 2.3 问题-论证-答案 给出论证的过程&#xff08;应该含有方程式&#xff09; 综上&#xff0c;考虑到视频的可视化过程&#xff0c;着…

java日志技术——Logback日志框架安装及概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 日志 什么是日志 程序中的日志&#xff0c;通常就是一个文件&#xff0c;里面记录的是程序运行过程中的各种信息&#xff0c;通过日志可以进行操作分析&#xff0c;bug定位等 记录日志的方案 程…

Django之Celery篇(二)

一、Celery-任务的调用 1.1、异步任务调用 delay( )方法 from celery_task import *def delay():rs = send_email.delay(baizhan)print(rs.id)rs2 = send_msg.delay(SXT)print(rs2.id)1.2、定时任务调用 apply_async( )方法 from celery_task import * import datetimedef …

Linux文件系统和日志管理

文件系统的组成 Linux 文件系统会为每个文件分配两个数据结构&#xff1a;索引节点&#xff08;index node&#xff09; 和 目录项&#xff08;directory entry&#xff09;&#xff0c;它们主要用来记录文件的元信息和目录层次结构。 索引节点&#xff0c;也就是 inode&#…