题目一
试题编号: 202309-1
试题名称: 坐标变换(其一)
时间限制: 1.0s
内存限制: 512.0MB
问题描述:
问题描述
对于平面直角坐标系上的坐标 (x,y),小 P 定义了一个包含 n 个操作的序列 T=(t1,t2,⋯,tn)。其中每个操作 ti(1≤i≤n)包含两个参数 dxi 和 dyi,表示将坐标 (x,y) 平移至 (x+dxi,y+dyi) 处。
现给定 m 个初始坐标,试计算对每个坐标 (xj,yj)(1≤j≤m)依次进行 T 中 n 个操作后的最终坐标。
输入格式
从标准输入读入数据。
输入共 n+m+1 行。
输入的第一行包含空格分隔的两个正整数 n 和 m,分别表示操作和初始坐标个数。
接下来 n 行依次输入 n 个操作,其中第 i(1≤i≤n)行包含空格分隔的两个整数 dxi、dyi。
接下来 m 行依次输入 m 个坐标,其中第 j(1≤j≤m)行包含空格分隔的两个整数 xj、yj。
输出格式
输出到标准输出中。
输出共 m 行,其中第 j(1≤j≤m)行包含空格分隔的两个整数,表示初始坐标 (xj,yj) 经过 n 个操作后的位置。
样例输入
3 2
10 10
0 0
10 -20
1 -1
0 0
样例输出
21 -11
20 -10
样例说明
第一个坐标 (1,−1) 经过三次操作后变为 (21,−11);第二个坐标 (0,0) 经过三次操作后变为 (20,−10)。
评测用例规模与约定
全部的测试数据满足:n,m≤100,所有输入数据(x,y,dx,dy)均为整数且绝对值不超过 100000。
题目分析(个人理解)
- 先看输入,第一行输入n次操作,m个坐标,第二行到n+1行输入每次操作的x,y的值,第n+1到第n+1+m行输入原坐标。
- 可以先将多次操作先计算合并成一次再计算,可以用列表存,然后边存边合并,输入原坐标后做一次计算输出即可。
- 傻瓜代码:
n,m=map(int,input().split())
l=[]
l1=[0,0]
l2=[]
l3=[0,0]
l4=[]
for i in range(n):
d=list(input().split())#存操作
l.append(d)
l1[0]+=int(l[i][0])
l1[1]+=int(l[i][1])
#print(l1)
for j in range(m):
d1=list(input().split())#存坐标
l3[0]=int(d1[0])+int(l1[0])
l3[1]=int(d1[1])+int(l1[1])
print('{} {}'.format(l3[0],l3[1]))
- 优化之后:
n, m = map(int,input().split())
temp_x = temp_y = 0
for i in range(n):
x1, y1 = map(int, input().split())
temp_x += x1
temp_y += y1
for i in range(m):
x, y = map(int, input().split())
x += temp_x
y += temp_y
print('{} {}'.format(x,y))
题目二
试题编号: 202309-2
试题名称: 坐标变换(其二)
时间限制: 2.0s
内存限制: 512.0MB
样例输入
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
Data
样例输出
-1858706.758 -83259.993
-1261428.46 201113.678
-75099.123 -738950.159
-119179.897 -789457.532
114151.88 -366009.892
提示
C/C++:建议使用 double 类型存储浮点数,并使用 scanf(“%lf”, &x); 进行输入,printf(“%f”, x); 输出,也可以使用 cin 和 cout 输入输出浮点数;#include <math.h> 后可使用三角函数 cos() 和 sin()。
Python:直接使用 print(x) 即可输出浮点数 x;from math import cos, sin 后可使用相应三角函数。
Java:建议使用 double 类型存储浮点数,可以使用 System.out.print(x); 进行输出;可使用 Math.cos() 和 Math.sin() 调用三角函数。
题目分析(个人理解)
- 注意,此题本人理解可能有歧义(提交不给分,如果各位同学有使用python并且满分的麻烦一定要私信我一下),我先讲本人的思路和对题目的理解,还是先看题目第一行输入n个参数表示有多少种操作,参数m表示有几个原坐标需要处理,最后的m行输入的四个参数i j x y分别表示i对x的操作,j对应y的操作,可是问题就在这里如果按照上述理解,那么也就是样例给出的解释,可是,题目中的问题吗描述部分表示的是对(x,y)进行i操作再进行j操作。
- 主要是出在旋转的理解上,我按照第一种的理解去做1,也就是i,j分别对x,y操作。
- 我设置一个字典,keys表示操作编号,值是列表,列表1的0位的数值表示是旋转还是拉伸操作,1位表示k或弧度。
- 每写入一个i j xy 就进行一次判断,遍历完m次,每次遍历都输出即可,问题就在于按照上述两种方法去运算都得不到样例给定的结果,很有可能是我的理解问题,期待各位能在评论区讨论交流!!!
- 给出个人理解的代码:(此种方法伸缩可达到样例的结果,变换却不行)
from math import cos,sin
n,m=map(int,input().split())
l1=[]
l3=[]
for i in range(n):
operate=list(input().split())#存放操作
l1.append(operate)
l=[i for i in range(1,n+1)]#给操作编号
dict1=dict(zip(l,l1))#关键字是操作编号,值的第一个元素是1或2
#print(dict1)
for k in range(m):
l2=list(input().split())#存每一次的查找操作
for p in l:
if l2[0]==p and dict1[p][0]=='1':
x=float(l2[2])*float(dict1[p][1])
else :#l2[0] == p and dict1[p][0] == '2'
x = float(l2[2]) * cos(float(dict1[p][1]))-float(l2[3])*sin(float(dict1[p][1]))
if l2[1] == p and dict1[p][0] == '2':
y = float(l2[2]) * sin(float(dict1[p][1]))+float(l2[3])*cos(float(dict1[p][1]))
else : #l2[1] == p and dict1[p][0] == '1'
y = float(l2[3]) * float(dict1[p][1])
print('{:.3f} {:.3f}'.format(x,y))
总结
本人从2023.9.14开始刷题从13年12月的题刷到23年10月的题因为能力有限只做了第一题和第二题,发现本人知识框架还未完善,CCF CSP认证打卡不会间断只不过最近几期除了做第三题还会增加对的pyhton程序设计的全面完善,比如对很多第三方库的知识梳理,以及数据结构的知识综合编程题来应用,本人将会不停探索一切学习方法,力求提高编程和优化算法的能力!!!
路漫漫其修远兮,希望与诸君一起进步!!!