CCF CSP认证 历年题目自练Day36

题目一

试题编号: 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。

题目分析(个人理解)

  1. 先看输入,第一行输入n次操作,m个坐标,第二行到n+1行输入每次操作的x,y的值,第n+1到第n+1+m行输入原坐标。
  2. 可以先将多次操作先计算合并成一次再计算,可以用列表存,然后边存边合并,输入原坐标后做一次计算输出即可。
  3. 傻瓜代码:
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]))
  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
CCF CSP认证 历年题目自练Day36_第1张图片
样例输入
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
CCF CSP认证 历年题目自练Day36_第2张图片
提示
C/C++:建议使用 double 类型存储浮点数,并使用 scanf(“%lf”, &x); 进行输入,printf(“%f”, x); 输出,也可以使用 cin 和 cout 输入输出浮点数;#include 后可使用三角函数 cos() 和 sin()。

Python:直接使用 print(x) 即可输出浮点数 x;from math import cos, sin 后可使用相应三角函数。

Java:建议使用 double 类型存储浮点数,可以使用 System.out.print(x); 进行输出;可使用 Math.cos() 和 Math.sin() 调用三角函数。

题目分析(个人理解)

  1. 我先讲本人的思路和对题目的理解,还是先看题目第一行输入n个参数表示有多少种操作,参数m表示有几个原坐标需要处理,最后的m行输入的四个参数i j x y分别表示从i到j对(x,y)操作,比如样例第一行,1 6操作,实际上是对后面的坐标做从编号1到6操作的每一步操作,然后输出结果。
  2. 我设置一个字典,keys表示操作编号,值是列表,列表的0位的数值表示是旋转还是拉伸操作,1位表示k或弧度。
  3. 代码如下:(想到前缀和但是未能实现)
#80分超时
from math import cos,sin
n,m=map(int,input().split())
l1=[]

for i in range(n):
    operate=list(input().split())#存放操作
    l1.append(operate)
l=[str(i) for i in range(1,n+1)]#给操作编号
dict1=dict(zip(l,l1))#关键字是操作编号,值的第一个元素是1或2
y,x=0,0
#print(dict1)
for k in range(m):
    l2=list(map(int,input().split()))#存i j x y
    x,y=l2[2],l2[3]
    for j in range(l2[0],l2[1]+1):
        if dict1[str(j)][0]=='1':#伸缩
            x ,y= float(x) * float(dict1[str(j)][1]),float(y) * float(dict1[str(j)][1])
        if dict1[str(j)][0]=='2':#旋转
            x,y= float(x) * cos(float(dict1[str(j)][1])) - float(y) * sin(float(dict1[str(j)][1])),float(x) * sin(float(dict1[str(j)][1]))+float(y)*cos(float(dict1[str(j)][1]))

    print('{:.3f} {:.3f}'.format(x,y))

  1. 写的好看一点的超时代码(80分)
from math import cos,sin

#拉伸
def draw_1(k,x,y):
    x1=k*x;y1=k*y;return x1,y1
#旋转
def rotate_2(a,x,y):
    x2=x*cos(a)-y*sin(a);
    y2=x*sin(a)+y*cos(a)
    return x2,y2

#输入n和m,空格隔开
n, m=tuple(map(eval,input().split()))
list1,list2=[],[]

#输入n个操作list1[]
for i in range(n):
    n1, n2=tuple(map(eval,input().split()))
    list1.append((n1, n2))

#输入m个查询并计算list2[]
for j in range(m):
    m1, m2, m3, m4=tuple(map(eval,input().split()))
    for k in range(m1, m2+1):
        if list1[k-1][0]==1:
            m3, m4= draw_1(list1[k-1][1], m3, m4)
        else:
            m3, m4= rotate_2(list1[k-1][1], m3, m4)
    list2.append((m3, m4))


for l in list2:
    print(round(l[0],3),end=' ');print(round(l[1],3))

总结

本人从2023.9.14开始刷题从13年12月的题刷到23年10月的题因为能力有限只做了第一题和第二题,发现本人知识框架还未完善,CCF CSP认证打卡不会间断只不过最近几期除了做第三题还会增加对的pyhton程序设计的全面完善,比如对很多第三方库的知识梳理,以及数据结构的知识综合编程题来应用,本人将会不停探索一切学习方法,力求提高编程和优化算法的能力!!!
路漫漫其修远兮,希望与诸君一起进步!!!

你可能感兴趣的:(CCF,CSP认证,算法,数据结构,python,ccf,csp)