CCF计算机软件能力认证202309-2坐标变换(其二)(C语言)

2023-12-06 20:52

本文主要是介绍CCF计算机软件能力认证202309-2坐标变换(其二)(C语言),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ccf-csp计算机软件能力认证202309-2坐标变换(其二)(C语言版)


题目内容:

问题描述
在这里插入图片描述

输入格式
在这里插入图片描述

输出格式
在这里插入图片描述

样例输入

10 5
2 0.59
2 4.956
1 0.997
1 1.364
1 1.242
1 0.82
2 2.824
1 0.716
2 0.178
2 4.094
1 6 -953188 -946637
1 9 969538 848081
4 7 -114758 522223
1 9 -535079 601597
8 8 159430 -511187

样例输出

-1858706.758 -83259.993
-1261428.46 201113.678
-75099.123 -738950.159
-119179.897 -789457.532
114151.88 -366009.892

样例解释

请添加图片描述

评测用例规模与约定
在这里插入图片描述
评分方式

如果你输出的浮点数与参考结果相比,满足绝对误差不大于 0.1,则该测试点满分,否则不得分。

提示
在这里插入图片描述

解题思路

  1.第一步分析问题,n个操作,m个坐标,对每个坐标的操作是n个操作里的某个区间,鉴于此首先自然而然想到的肯定就是存储下来所有的操作,然后对于每个坐标进行for循环这一系列操作。但是最终成绩只有80分,所以这个思路当数据量比较大时不符合题目要求。
  2.简化问题,既然最直接的方法不可以,那我们就尝试简化数学问题,参考第一题,这一题肯定也是将伸缩量和旋转角度归一至一个值,旋转很多次,最终也只是旋转了一个固定的角度,伸缩同理。所以既然是一系列操作里的某个区间,那我们如何能够快速的获得这个区间的伸缩量和旋转角度呢?
  3.解决问题,从普通到特殊,假如现在这个区间是所有的操作,那么只需要从第一步到最后一步逐步加减乘除就可以,假设现在不想要最后一步了,减去相应的旋转角度或是除去相应的伸缩量就可以,不想要第一步操作也是同理。自然而然就能想到,每到一个节点,我们存储从第一步到这个节点的所有变换,那么例如我们现在想要第四步到第十步的变换,那么只需要第一步到第十步的变换减去第一步到第三步的变换即可,相应的减去相应的弧度,除去相应的伸缩量,至此问题得到了解决。
  4.最终由于每个数据只用一次,我们采用边存边用的形式,对于每一个输入的操作,进行汇总并存入新的数组,代表从第一步到现在所有操作的汇总。最后对于输入的操作区间以及坐标,进行相应的删减后按照题目提供的计算公式计算并输出即可。

提交后得100分的C语言程序如下:

#include<stdio.h>
#include<math.h>int main() {int n, m, i, flag, a, b, x, y;scanf("%d%d", &n, &m);double temp, rad = 0, k = 1, nrad[n+1], nk[n+1];nrad[0] = 0;nk[0] = 1;for (i = 1; i <= n; i++) {scanf("%d%lf", &flag, &temp);if (flag == 1) k = k * temp;else rad = rad + temp;nk[i] = k;nrad[i] = rad;}while (m--) {scanf("%d%d%d%d", &a, &b, &x, &y);k = nk[b] / nk[a-1];rad = nrad[b] - nrad[a-1];printf("%lf %lf\n", x * k * cos(rad) - y * k * sin(rad), x * k * sin(rad) + y * k * cos(rad));}return 0;
}

这篇关于CCF计算机软件能力认证202309-2坐标变换(其二)(C语言)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点