CSP-CCF 202303-1 田地丈量

news/2024/12/22 9:11:31/

一、问题描述

问题描述
西西艾弗岛上散落着 𝑛 块田地。每块田地可视为平面直角坐标系下的一块矩形区域,由左下角坐标 (𝑥1,𝑦1) 和右上角坐标 (𝑥2,𝑦2) 唯一确定,且满足 𝑥1<𝑥2、𝑦1<𝑦2。这 𝑛 块田地中,任意两块的交集面积均为 0,仅边界处可能有所重叠。

最近,顿顿想要在南山脚下开垦出一块面积为 𝑎×𝑏 矩形田地,其左下角坐标为 (0,0)、右上角坐标为 (𝑎,𝑏)。试计算顿顿选定区域内已经存在的田地面积。

输入格式
从标准输入读入数据。

输入共 𝑛+1 行。

输入的第一行包含空格分隔的三个正整数 𝑛、𝑎 和 𝑏,分别表示西西艾弗岛上田地块数和顿顿选定区域的右上角坐标。

接下来 𝑛 行,每行包含空格分隔的四个整数 𝑥1、𝑦1、𝑥2 和 𝑦2,表示一块田地的位置。

输出格式
输出到标准输出。

输出一个整数,表示顿顿选定区域内的田地面积。

样例输入
4 10 10
0 0 5 5
5 -2 15 3
8 8 15 15
-2 10 3 15

样例输出
44

样例解释
如图所示,选定区域内田地(绿色区域)面积为 44。

 

二、解答

方法一:写两个函数分别求其长度和高度,分别有5种情况

#include<iostream>
using namespace std;
//分五种情况求长度
int Length(int x1, int x2,int a)
{if (x1 <= 0 && x2 > 0 && x2 <= a)    {return x2;}if (x1 >= 0 && x2 <= a){return x2 - x1;}if (x1>=0&&x1 < a && x2 >= a){return a - x1;}if(x1<=0&&x2>=a){return a;}if(x2<=0||x1>=a){return 0;}
}
//分五种情况求高度
int Height(int y1, int y2, int b)
{if (y1 <= 0 && y2 > 0 && y2 <= b){return y2;}if (y1 >= 0 && y2 <= b){return y2 - y1;}if (y1>=0&&y1 < b && y2 >= b){return b - y1;}if (y1 <= 0 && y2 >= b){return b;}if (y1 >= b||y2<=0){return 0;}
}
int main()
{int n, a, b;cin >> n >> a >> b; int x1, y1, x2, y2,length,height;int area=0;for (int i = 0; i < n; i++){cin >> x1 >> y1 >> x2 >> y2;length = Length(x1, x2, a);height = Height(y1, y2, b);area += length * height;}cout << area << endl;return 0;
}

方法二:方法1的简化,发现规律:长=min(x2,a)-max(x1,0),宽=min(y2,b)-max(y1,0),但是注意会有小于0的情况,即没有重叠部分。

#include<iostream>
using namespace std;
int max(int m, int n)
{if (m >n){return m;}else{return n;}
}
int min(int p, int q)
{if (p<q){return p;}else{return q;}
}
int main()
{int n, a, b;cin >> n >> a >> b;int x1, y1, x2, y2, length, height;int area = 0;for (int i = 0; i < n; i++){cin >> x1 >> y1 >> x2 >> y2;//长=min(x2,a)-max(x1,0),宽=min(y2,b)-max(y1,0)//另外还要考虑到该矩形在外面的情况,即length和height小于0就说明是在外面length = min(x2,a)-max(x1,0);//不需要if语句该行可以写成:length =max( min(x2,a)-max(x1,0),0);height = min(y2,b)-max(y1,0);if(length>0&&height>0){ area += length * height;}}cout << area << endl;return 0;
}

三、总结

本题看似简单,但是情况太多了,如果盲目地写,以我的能力写不出来,也花了我很长很长时间。最后无奈请求万能的互联网的帮助,发现可以根据长和宽的不同情况来求,非常巧妙。但是,这道题如果是放在考场,我可能大概率会做不出来,ε=(´ο`*)))唉。这也说明了我在数学方面能力的欠缺。能怎么办,继续努力吧。

 

 

 


http://www.ppmy.cn/news/1512182.html

相关文章

SpringBoot依赖之Spring Data Redis 实现HyperLogLog类型

概念 Spring Data Redis (AccessDriver) 依赖名称: Spring Data Redis (AccessDriver)功能描述: Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Supports Cluster, Sentinel, Pipelining, Auto-Reconnect, Codecs and muc…

设计模式 -- 概述

1 基本概述 设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。 这些解决方案是众多软件开发人员经过相当长的一段时间的试验…

SFP光模块、gt口、PMD、PMA、PCS之间的关系

ZYNQ内部的GT&#xff08;高速收发器&#xff09;接口包含了PCS&#xff08;物理编码子层&#xff09;与PMA&#xff08;物理介质接入层&#xff09;。这两个层在高速数据传输中起着至关重要的作用。 PCS层&#xff08;物理编码子层&#xff09; PCS层位于协调子层&#xff0…

大语言模型 - 提示词(Prompt)工程入门

文章目录 一、什么是提示词工程二、编写提示词的基本原则1 、编写清晰、具体的指令&#xff08;1&#xff09;策略一&#xff1a;使用分隔符清晰地表示输入的不同部分&#xff08;2&#xff09;策略二&#xff1a;要求一个结构化的输出&#xff0c;可以是 Json、HTML 等格式&am…

手机设备IP地址切换:方法、应用与注意事项

在当今数字化时代&#xff0c;手机已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;手机都扮演着重要角色。然而&#xff0c;随着网络环境的日益复杂&#xff0c;有时我们需要切换手机设备的IP地址以满足特定的需求&#xff0c;如保护隐私、绕过地…

【GH】【EXCEL】P7: Control

XL Label XL Dropdown XL CHECK BOX XL Button XL Scroller XL Spinner XL ListBox

OCR识别行驶证(阿里云和百度云)

OCR识别行驶证(阿里云和百度云) 一、使用场景 1、通过识别行驶证&#xff0c;获取相关汽车信息&#xff0c;替代手输 二、效果图 三、代码部分&#xff1a; 1、阿里云OCR 1.1、控制层 PostMapping("/ocrCard") public JSONObject ocrCard(RequestPart("fi…

动态规划篇-代码随想录算法训练营第三十五天| 完全背包问题,322. 零钱兑换,518.零钱兑换II,组合总和 Ⅳ

完全背包问题 题目链接&#xff1a;52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 讲解视频&#xff1a; 带你学透完全背包问题&#xff01; 题目描述&#xff1a; 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新…