CSP认证2022-12:现值计算、训练计划、JPEG解码,python满分解答代码

CSP认证2022-12:现值计算、训练计划、JPEG解码,python满分解答代码

目录

一、现值计算

题目背景及描述

输入和输出 

思路

代码和结果

二、训练计划

题目背景及描述

输入和输出 

思路 

代码和结果

三、JPEG解码

问题背景

思路 

代码和结果


一、现值计算

题目背景及描述

ed004263000a4672a4f846f7ce8f72f2.png

输入和输出 

f97e79be87894c5e91aea54b020eab48.png

输入

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)

b0a2b760014847e9873cb86b9e871a34.png

二、训练计划

题目背景及描述

3129545b29504e83ab4d56804e976c3d.png

输入和输出 

606905e846214fdebb1b512c3ae49528.png

输入

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=' ')

a935a87aa81e432fba5559ef9bd76df6.png

三、JPEG解码

问题背景

f29517c189d64afa8beb2f1de8a12c86.png

思路 

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()

20cb15898873475d9e8bb08b22445a6c.png

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值