CSP认证2022-12:现值计算、训练计划、JPEG解码,python满分解答代码
目录
一、现值计算
题目背景及描述
输入和输出
输入
2 0.05
-200 100 100
输出
-14.059
思路
按照题意给出的公式写出来即可
代码和结果
n,i = list(map(float,input().split()))
n = int(n)
data = list(map(int,input().split()))
result = data[0]
for j in range(1,n+1):#从第1年开始计算
#到今年的价值
result = result*(1+i)**1
# 存入或支出新钱
result += data[j]
final_res = result*(1+i)**(-n)
print(final_res)
二、训练计划
题目背景及描述
输入和输出
输入
10 7
0 1 0 3 2 3 0
2 1 6 3 10 4 3
输出
1 3 1 7 4 7 1
思路
(1)计算每一个训练科目的最早开始时间:如果当前训练科目不依赖任何训练科目,则其最早开始时间为1,否则加上其依赖的训练科目所需的时间;同时继续进行判断,直到不依赖任何训练科目。
(2)计算每一个训练科目的最晚开始时间:倒序遍历每一个训练科目,因为要想让所有训练科目在指定时间内完成,那么被依赖的科目的最晚开始时间应该提前,例如以下例子:
10 5 0 1 1 3 4 1 5 7 1 1 在这里第一个活动的最晚时间不是10,因为若为10,则活动是无法完成的
活动2依赖于1,导致活动1的期限从10变成了5。
最后遍历每一个训练科目的最晚开始时间,如果小于等于0,则该任务无法完成;否则输出最晚开始时间。
代码和结果
n,m = list(map(int,input().split()))
P = [0]#训练科目依赖列表
T = [0]#训练科目所需天数列表
P.extend(list(map(int,input().split())))
T.extend(list(map(int,input().split())))
P_dict = {}#记录训练科目之间的依赖关系
T_dict = {}#存储每个科目所需时间
last_dict = {}#用一个字典存储活动最晚开始时间(不考虑依赖性的情况下,即活动最晚开始时间=距离大赛开幕的天数-所需时间)
T_dict[0] = 0
P_dict[0] = 0
for i in range(1,m+1):#初始化
T_dict[i] = T[i]
P_dict[i] = P[i]
last_dict[i] = n-T[i]+1
tag = True#能够在限定时间内完成训练
#计算最早开始时间
for i in range(1,m+1):#变量每一个训练科目
v = P_dict[i]#依赖的科目,若为0,则没有依赖的科目,否则有依赖的科目
result = 1#在没有依赖的情况下,训练科目最早开始的时间为1,因为其不需要等待其他训练科目
if v==0:
print(result,end=' ')
else:
while v!=0:#如果不为0,即存在依赖关系,则进行递归
result+=T_dict[v]#加上第v个科目的时间
v = P_dict[v]#寻找下一个科目
# 直到为0,退出循环
print(result,end=' ')
# 计算最晚开始时间
k = m
while k>0:#倒序遍历
v = P_dict[k] # 依赖的科目,若为0,则没有依赖的科目,否则有依赖的科目
origin_last = last_dict[k]#原始的依赖时间
if v==0:#没有依赖,说明不需要修改被依赖科目的最晚开始时间
pass
else:
while v!=0:
#更新被依赖活动最晚的开始时间
# 活动v必须在origin_last之前完成,如下的例子,活动2依赖于1,导致活动1的期限从10变成了5(origin_last-T[v]),活动2的最晚开始时间origin_last = 6
last_dict[v] = min(last_dict[v],origin_last-T[v])
v = P_dict[v]
k-=1
#遍历每一个训练科目的最晚开始时间,如果小于等于0,则该任务无法完成,设置tag为False
for j in last_dict.values():
if j <=0:
tag=False
break
'''
10 5
0 1 1 3 4
1 5 7 1 1
在这里第一个活动的最晚时间不是10,因为若为10,则活动是无法完成的,所以这里不能直接将P[i]=0的活动时间加到last_list中
'''
if tag:
print()
for j in last_dict.values():
print(j,end=' ')
三、JPEG解码
问题背景
思路
1.首先算出z字形移动的下标,因为矩阵很小,所以可以直接手动计算下标,得到
index = [(0,0),(0,1),(1,0),(2,0),(1,1),(0,2),(0,3),(1,2),(2,1),(3,0),(4,0),(3,1),(2,2),(1,3),(0,4),(0,5),(1,4),(2,3),(3,2),(4,1),(5,0),(6,0),(5,1),(4,2),(3,3),(2,4),(1,5),(0,6),(0,7),(1,6),(2,5),(3,4),(4,3),(5,2),(6,1),(7,0),(7,1),(6,2),(5,3),(4,4),(3,5),(2,6),(1,7),(2,7),(3,6),(4,5),(5,4),(6,3),(7,2),(7,3),(6,4),(5,5),(4,6),(3,7),(4,7),(5,6),(6,5),(7,4),(7,5),(6,6),(5,7),(6,7),(7,6),(7,7)] #Q_ij_index
当然也可以写一个代码计算。
2.按照要求进行矩阵运算即可
代码和结果
import math
def print_matrix(matrix):
for i in range(len(matrix)):
for j in range(len(matrix[0])):
print(matrix[i][j],end=' ')
print()
def Alpha(u):
if u==0:
return (1/2)**(1/2)
else:
return 1
def judge(x):
x = round(x)
if x>255:
return 255
elif x<0:
return 0
else:
return x
Q = []
N = 8
for i in range(N):
Q_i = list(map(int,input().split()))
Q.append(Q_i)
n = int(input())#扫描数据的个数 n可能为0
T = int(input())
Scan_Data = list(map(int,input().split()))
# 步骤二,初始化8 x 8的矩阵M
M = []
for i in range(N):
M.append([0 for j in range(N)])
index = [(0,0),(0,1),(1,0),(2,0),(1,1),(0,2),(0,3),(1,2),(2,1),(3,0),(4,0),(3,1),(2,2),(1,3),(0,4),(0,5),(1,4),(2,3),(3,2),(4,1),(5,0),(6,0),(5,1),(4,2),(3,3),(2,4),(1,5),(0,6),(0,7),(1,6),(2,5),(3,4),(4,3),(5,2),(6,1),(7,0),(7,1),(6,2),(5,3),(4,4),(3,5),(2,6),(1,7),(2,7),(3,6),(4,5),(5,4),(6,3),(7,2),(7,3),(6,4),(5,5),(4,6),(3,7),(4,7),(5,6),(6,5),(7,4),(7,5),(6,6),(5,7),(6,7),(7,6),(7,7)] #Q_ij_index
#将扫描数据填入M中
for i in range(n):
#z字形的坐标
z_i,z_j = index[i][0],index[i][1]
Scan = Scan_Data[i]
M[z_i][z_j] = Scan
if T==0:
print_matrix(M)
else:
# 与量化矩阵相乘
M_Q = []
for i in range(N):
temp = []
for j in range(N):
temp.append(M[i][j]*Q[i][j])
M_Q.append(temp)
if T==1:
print_matrix(M_Q)
else:
for i in range(N):
for j in range(N):
res = 0.0
for u in range(N):
for v in range(N):
res += Alpha(u) * Alpha(v) * M_Q[u][v] * math.cos(math.pi / 8 * (i + 1 / 2) * u) * math.cos(
math.pi / 8 * (j + 1 / 2) * v)
res = judge(res/4+128)
print(res,end=' ')
print()