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

2024-02-04 23:04
文章标签 csp 坐标 变换 202309

本文主要是介绍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;
}

请添加图片描述

这篇关于CSP-202309-2-坐标变换(其二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

CSP-J基础之cmath常见函数

文章目录 前言1. **`sin` 函数**2. **`cos` 函数**3. **`exp` 函数**4. **`log` 函数**5. **`fabs` 函数**6. **`pow` 函数**7. **`sqrt` 函数**8. **`ceil` 函数**9. **`floor` 函数** 总结 前言 在计算机科学与编程中,数学函数是解决各种计算问题的基础工具。C++标准

CSP-J选择题 - 排列组合

排列问题:有5名学生参加比赛,要求排成一排拍照,有多少种不同的排列方式?组合问题:从10本书中选出3本书送给朋友,有多少种不同的选择方式?排列问题:一个教室有7个座位,5个学生需要坐下,有多少种不同的排列方式?组合问题:从12个人中选出4个人组成一个团队,有多少种不同的方式?排列问题:一个密码由4个字母组成,字母可以重复使用,有多少种不同的排列组合?组合问题:从8个不同颜色的球中选出3个,不考虑顺

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

CSP-J 之C++常用英文缩写

文章目录 C++常用英文缩写前言常用缩写解析C++ 基础缩写输入输出相关控制台 命名与类型常用函数在线测评相关 总结 C++常用英文缩写 前言 在编程比赛和日常开发中,C++是一门广泛使用的编程语言,许多英文缩写贯穿其中。了解这些缩写不仅有助于提高编程效率,还能加深对编程语言及其工作机制的理解。本文将介绍C++中常见的英文缩写,以及它们在编程中的实际含义和应用。 常用

C/C++两点坐标求距离以及C++保留两位小数输出,秒了

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 3. 备注 1. 前言 依旧是带来一个练手的题目,目的就一个,方法千千万,通向终点的方式有很多种,没有谁与谁,我们都是为了成为更好的自己。 2. 正文 2.1 问题 题目描述: 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。 输入格式: