CSP-202309-2-坐标变换(其二)

一、遇到问题:迭代计算时间超限

  • 按照常规思路,可以从beginend逐步计算,共需要约end-begin次运算,时间复杂度较高,导致时间超限。

二、解决思路:累积

1.操作数累积部分

在输入阶段,代码通过循环读取每个操作,根据操作类型(1或2)更新累积的缩放系数和旋转角度。

  • 对于缩放操作(flag为1),将当前操作数的缩放系数k更新为前一步操作数的缩放系数乘以当前操作的数值num。同时,保持旋转角度r不变。

  • 对于旋转操作(flag为2),将当前操作数的旋转角度r更新为前一步操作数的旋转角度加上当前操作的数值num。同时,保持缩放系数k不变。

这样,通过不断累积操作数,数组x中保存了每一步的累积结果

2. 查询阶段

对于每个查询,代码读取起始和结束位置,以及初始点的坐标。然后,根据累积的操作数,计算起始和结束位置的缩放系数和旋转角度。最后,对初始点进行一次相应的缩放和旋转计算,得到最终结果。

double k1 = x[end].k / x[begin - 1].k;
double r1 = x[end].r - x[begin - 1].r;
x1 *= k1, y1 *= k1;
double temp_x1 = x1, temp_y1 = y1;
x1 = temp_x1 * cos(r1) - temp_y1 * sin(r1);
y1 = temp_x1 * sin(r1) + temp_y1 * cos(r1);

3.总结

上述思路可以优化时间复杂度的主要原因在于通过累积操作数的方式,避免了直接迭代计算。下面是具体的优化原因:

  1. 累积操作数减少迭代次数: 传统的计算方式是逐步迭代,每一步都重新计算累积的缩放系数和旋转角度,时间复杂度为O(N)。而在优化的思路中,通过累积操作数,每一步都是在前一步的基础上进行更新。为操作直接提供了最终状态,而不是通过逐步计算得到。

  2. 常数时间的查询操作: 在查询阶段,通过累积操作数,可以直接计算起始和结束位置的缩放系数和旋转角度,而不需要进行迭代计算。这使得查询操作的时间复杂度为常数时间,而不是线性时间。

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
struct Operand
{double k;double r;
};int main() {int numberOfOperations, numberOfQueries;cin >> numberOfOperations >> numberOfQueries;Operand* x = new Operand[numberOfOperations + 1];for (int i = 0; i <= numberOfOperations; i++){x[i] = { 1,0 };}// 输入操作数(累积)for (int i = 1; i <= numberOfOperations; i++){int flag;double num;cin >> flag >> num;// kif (flag == 1){x[i].k = x[i - 1].k * num;x[i].r = x[i - 1].r;}// rif (flag == 2){x[i].k = x[i - 1].k;x[i].r = x[i - 1].r + num;}}// 输入查询for (int i = 0; i < numberOfQueries; i++){int begin, end;double x1, y1;cin >> begin >> end >> x1 >> y1;double k1 = x[end].k / x[begin - 1].k;double r1 = x[end].r - x[begin - 1].r;x1 *= k1, y1 *= k1;double temp_x1 = x1, temp_y1 = y1;x1 = temp_x1 * cos(r1) - temp_y1 * sin(r1);y1 = temp_x1 * sin(r1) + temp_y1 * cos(r1);cout << fixed << setprecision(3) << x1 << " " << y1 << endl;}return 0;
}

请添加图片描述

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

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

相关文章

springboot基于javaWEB的旅游推荐系统设计与实现+vue

随着人民生活水平的提高&#xff0c;对于旅游的需求越来越强烈。目前传统旅游的模式已经无法满足当前消费者的旅游需求。通过分析传统旅游的缺点&#xff0c;我们可以明确传统旅游业无法满足日益多元化的消费者。在消费者追求更加个性化的旅游体验之下&#xff0c;旅游网站就能…

布隆过滤器有什么用?什么原理?如何使用?

1 前言 布隆过滤器相信大家没用过的话&#xff0c;也已经听过了。 布隆过滤器主要是为了解决海量数据的存在性问题。对于海量数据中判定某个数据是否存在且容忍轻微误差这一场景&#xff08;比如缓存穿透、海量数据去重&#xff09;来说&#xff0c;非常适合。 2 什么是布隆…

AI大模型专题:OWASP大语言模型应用程序十大风险V1.0

今天分享的是AI大模型系列深度研究报告&#xff1a;《AI大模型专题&#xff1a;OWASP大语言模型应用程序十大风险V1.0》。 &#xff08;报告出品方&#xff1a;OWASP&#xff09; 报告共计&#xff1a;14页 LM01:2023_ 提示词注入 描述&#xff1a;提示词注入包括绕过过滤器…

云打印机怎么连接手机?

现在越来越多的人使用手机来办公或学习。而当我们需要打印文件时,如何用云打印机连接手机就非常重要了。易绘创云打印服务非常实用&#xff0c;那么易绘创云打印机又该怎么连接手机&#xff1f;下面就让我们一起来了解吧。 云打印机怎么连接手机&#xff1f; 当下云打印机连接…

SolidWorks 2023 使用操作流程

1. 把头 1.1. 新建零件 1.2. 新建草图 1.3. 拉升凸台 1.4. 等距实体 切换到锤头&#xff0c;新建草图&#xff0c;等距实体1mm 1.5. 拉升凸台 将上一个步骤的草图&#xff0c;进行特征拉升 1.6. 镜像处理 1.7. 圆角处理 1.8. 绘制凹槽 在锤子的侧面绘制草图 1.9. 挖出把手孔…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(二)

在上一篇文章中&#xff0c;我们成功验证了Intel Threading Building Blocks (TBB) 与 OpenMP 在多线程并行处理方面的加速潜力。为了更深入地理解这些技术在实际应用场景中的效能提升&#xff0c;接下来我们将目光转向目标开发板环境&#xff0c;进一步探究这两种框架在嵌入式…

vulhub中spring的CVE-2022-22965漏洞复现

在JDK 9上运行的Spring MVC或Spring WebFlux应用程序可能存在通过数据绑定执行远程代码&#xff08;RCE&#xff09;的漏洞。 现在已知的利用方法要求应用程序以WAR部署的形式在Tomcat上运行&#xff0c;然而&#xff0c;该漏洞的性质更为普遍&#xff0c;可能有其他方法可以利…

[职场] 老教师对年轻教师的肺腑之言 #媒体#笔记

老教师对年轻教师的肺腑之言 对学生 不要拖堂&#xff01;不要拖堂&#xff01;不要拖堂&#xff01;临下课十分钟&#xff0c;学生已经心不在焉&#xff0c;更别说下课后了&#xff01;有什么内容等下节课再说&#xff0c;不连贯没关系&#xff0c;反正拖堂讲课他们更听不进去…

SOLID原理:用Golang的例子来解释

随着软件系统变得越来越复杂&#xff0c;编写模块化、灵活和易于理解的代码非常重要。实现这一目标的方法之一是遵循SOLID原则。这些原则是由罗伯特-C-马丁&#xff08;Robert C. Martin&#xff09;提出的&#xff0c;以帮助开发人员创建更容易维护、测试和扩展的代码。 本文将…

利用ReentrantLock解决死锁----以哲学家问题为例

问题描述 哲学家问题&#xff1a;其中多个哲学家在共享有限资源&#xff08;筷子&#xff09;的情况下进行工作&#xff08;思考和吃饭&#xff09;&#xff0c;这可能导致死锁。 每位哲学家需要两根筷子才能吃饭&#xff0c;而每根筷子只能被一位哲学家使用&#xff0c;这就…

C语言学习(6)—— 指针

一、指针 &#xff08;1&#xff09;指针是内存的地址&#xff1b;指针变量是保存了内存地址的变量。 &#xff08;2&#xff09;在声明指针变量时&#xff0c;如果没有确切的地址赋值&#xff0c;则声明为空指针&#xff1a;int *ptr NULL。 &#xff08;2&#xff09;获取…

91.网游逆向分析与插件开发-游戏窗口化助手-游戏窗口化助手的UI设计

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;项目需求与需求拆解-CSDN博客 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;e512d44da1b7e6a8726b1be0…

【Linux取经路】进程控制——程序替换

文章目录 一、单进程版程序替换看现象二、程序替换的基本原理三、程序替换接口学习3.1 替换自己写的可执行程序3.2 第三个参数 envp 验证四、结语一、单进程版程序替换看现象 #include <stdio.h> #

低代码平台四大常见用例开发:简化企业数字化进程

在数字化时代&#xff0c;企业面临着不断提升竞争力、降低成本、提高效率的压力。为了应对这些挑战&#xff0c;低代码平台应运而生&#xff0c;它能够帮助企业快速搭建所需应用&#xff0c;简化开发流程&#xff0c;降低开发成本。本文将介绍四大常见低代码平台用例&#xff0…

【Linux进程间通信】匿名管道

【Linux进程间通信】匿名管道 目录 【Linux进程间通信】匿名管道进程间通信介绍进程间通信目的进程间通信发展进程间通信分类 管道用fork来共享管道原理站在文件描述符角度——深度理解管道站在内核角度——管道本质 匿名管道在myshell中添加管道的实现&#xff1a;管道读写规则…

河道多参数浮标水质监测站在线分析仪

产品简介 浮标水质监测站是设立在河流、湖泊、水库、近岸海域等流域内进行现场水质自动监测的监测仪器&#xff0c;是以水质监测仪为核心&#xff0c;运用传感器技术&#xff0c;结合浮标体、电源供电系统、数据传输设备组成的放置于水域内的小型水质监测系统。用于连续自动监测…

【linux】文件修改记录

是的&#xff0c;在Linux上&#xff0c;您可以使用’ find 命令检查最近修改的文件。此实用程序可以搜索在指定天数内修改过的文件。你可以这样使用它: 查找主目录中最近24小时(1天)内修改过的文件。 find ~ -type f -mtime -1命令说明: -“~”表示您的主目录。 ’ -type f…

jss/css/html 相关的技术栈有哪些?

js 的技术组件有哪些&#xff1f;比如 jQuery vue 等 常见的JavaScript技术组件&#xff1a; jQuery&#xff1a; jQuery是一个快速、小巧且功能丰富的JavaScript库&#xff0c;用于简化DOM操作、事件处理、动画效果等任务。 React&#xff1a; React是由Facebook开发的用于构…

STM32--HAL库定时器学习记录(易懂)--持续学习

一、什么是定时器 定时器就是计数器&#xff0c;通过计数完成一系列功能。 二、定时器的分类 定时器分为基本定时器、通用定时器、高级定时器。级别不同&#xff0c;功能不同。级别越高&#xff0c;功能越强。 三、定时器&#xff08;计数器&#xff09;三个重要寄存器 预分…

五种主流数据库:排行榜与分页查询

默认情况下&#xff0c;查询语句会返回满足过滤条件的所有数据。但是&#xff0c;有些时候我们只需查看其中的部分结果&#xff0c;常见的这类应用场景包括 Top-N 排行榜和数据分页查询。 本文比较五种主流数据库限定查询结果数量的实现和差异&#xff0c;包括 MySQL、Oracle、…