CSP202212与CSP202309前三题pythonAC题解

202212-1 现值计算

nk = input().split()
n = int(nk[0])
k = float(nk[1])
price1 = input().split()
price = [float(i) for i in price1]
sum = 0.0
s = 1.0
for i in range(n+1):
    sum += s*price[i]
    s *= 1/(1+k)
print(sum)

202212-2 训练计划

nm = input().split()
n = int(nm[0])
m = int(nm[1])
relylist = input().split()
rely = [ int(i) for i in relylist ]
timelist = input().split()
time = [ int(i) for i in timelist ]
child = []
for i in range(m):
    child.append([])
    for j in range(m):
        if rely[j] == i+1:
            child[-1].append(j+1)
#print(child)
def dfstree(nowtime, nowwork):
    earlist = nowtime + time[nowwork-1]
    earlying = earlist
    if child[nowwork-1] == []:
        return earlist
    else:
        for i in child[nowwork-1]:
            a = dfstree(earlist, i)
            if a > earlying:
                earlying = a
        return earlying
#print(dfstree(1,1))
maxtime = 0
for i in range(m):
    a = dfstree(1,i+1)
    if a>maxtime:
        maxtime = a
maxtime -= 1
#print(maxtime)
est = []
for i in range(m):
    est.append(0)
def dfstree2(nowtime, nowwork):
    earlist = nowtime + time[nowwork-1]
    if est[nowwork-1] == 0:
        est[nowwork-1] = nowtime
    #print(est)
    earlying = earlist
    if child[nowwork-1] == []:
        return earlist
    else:
        for i in child[nowwork-1]:
            a = dfstree2(earlist, i)
            if a > earlying:
                earlying = a
        return earlying
for i in range(m):
    dfstree2(1,i+1)
for i in range(m):
    print(est[i],end = ' ')
print()
if maxtime<=n:
    for i in range(m):
        print(n-dfstree(1,i+1)+2,end=' ')

202212-3 JPEG解码

这题突出一个流程多但是不难

from math import *

q = []
for i in range(8):
    a = input().split()
    q.append([int(j) for j in a])
n = int(input())
t = int(input())
m11 = input().split()
m1 = [int(j) for j in m11]
for i in range(64-n):
    m1.append(0)

m2 = []
for i in range(8):
    m2.append([0,0,0,0,0,0,0,0])
right = [0,1]
down = [1,0]
pie = [1,-1]
ti = [-1,1]
turning = [right,down]
direc = [pie,ti]
turn = 0
go = 1
a = 0
b = 0
for i in range(64):
    #print(i,a,b)
    m2[a][b] = m1[i]   
    if a+direc[go][0]<0 or b+direc[go][1]<0 or a+direc[go][0]>7 or b+direc[go][1]>7:
        if a==7 and b==0:
            turn = (turn+1)%2
        a+=turning[turn][0]
        b+=turning[turn][1]
        turn = (turn+1)%2
        go = (go+1)%2
    else:
        a+=direc[go][0]
        b+=direc[go][1]
#print(m2)
m3 = []
for i in range(8):
    m3.append([0,0,0,0,0,0,0,0])
for i in range(8):
    for j in range(8):
        m3[i][j] = m2[i][j] * q[i][j]
#print(m3)
def alpha(x):
    if x!=0:
        return 1
    else:
        return sqrt(0.5)
m4 = []
for i in range(8):
    m4.append([0,0,0,0,0,0,0,0])
for i in range(8):
    for j in range(8):
        for u in range(8):
            for v in range(8):
                m4[i][j] += 0.25*alpha(u)*alpha(v)*m3[u][v]*cos(pi*(i+0.5)*u/8)*cos(pi*(j+0.5)*v/8)
#print(m4)
for i in range(8):
    for j in range(8):
        m4[i][j]+=128.5
        m4[i][j] = int(m4[i][j])
        if m4[i][j] > 255:
            m4[i][j] = 255
        if m4[i][j] < 0:
            m4[i][j] = 0
if t==0:
    for i in range(8):
        for j in range(8):
            print(m2[i][j],end = ' ')
        print()
elif t==1:
    for i in range(8):
        for j in range(8):
            print(m3[i][j],end = ' ')
        print()
elif t==2:
    for i in range(8):
        for j in range(8):
            print(m4[i][j],end = ' ')
        print()


202309-1 坐标变换(其一)

nm = input().split()
n = int(nm[0])
m = int(nm[1])
change = [0,0]
for i in range(n):
    dxdy = input().split()
    change[0] += int(dxdy[0])
    change[1] += int(dxdy[1])
for i in range(m):
    xy = input().split()
    print(int(xy[0])+change[0], int(xy[1])+change[1])

202309-2 坐标变换(其二)

这题时间卡的比较死,必须在输入端就建立数组存好[1...k]的伸缩量和旋转角,用的时候再减。

from math import cos, sin, pi
nm = input().split()
n = int(nm[0])
m = int(nm[1])
types = []
ktheta = []
change = [[1,0]]
for i in range(n):
    line = input().split()
    k = int(line[0])
    t = float(line[1])
    types.append(k)
    ktheta.append(t)

    if k==1:
        change.append([change[-1][0] * t,change[-1][1]])
    else:
        change.append([change[-1][0],change[-1][1] + t])
        
for l in range(m):
    ijxy = input().split()
    i = int(ijxy[0])
    j = int(ijxy[1])
    x = int(ijxy[2])
    y = int(ijxy[3])
    k = change[j][0] / change[i-1][0]
    t = change[j][1] - change[i-1][1]
    '''
    这样会超时
    for p in range(i-1,j,1):
        if types[p] == 1:
            k *= ktheta[p]
        if types[p] == 2:
            t += ktheta[p]
    '''
    #print(k,t)
    x *= k
    y *= k
    c = cos(t)
    s = sin(t)
    x1 = x*c - y*s
    y1 = x*s + y*c
    x = x1
    y = y1
    print("{:.4f} {:.4f}".format(x,y))

202309-3 梯度求解

转化成a0x1^a1x2^a2...+b0x1^b1x2^b2...求解

maxint = int((1e+9)+7)

nm = input().split()
n = int(nm[0])
m = int(nm[1])

def makexiang():
    global n
    a = [1]
    for i in range(n):
        a.append(0)
    return a

def multi(a,b):
    global n
    c = makexiang()
    c[0] = a[0]*b[0] % maxint
    for i in range(1,n+1):
        c[i] = a[i]+b[i]
    return c

line = input().split()
xiang = []
for item in line:
    
    try:
        b = int(item)
        #print(item,end=" ")
        a = makexiang()
        a[0] = int(item)
        xiang.append([a])
        continue
    except:
        pass
    
    if item[0]=='x':
        num = item[1:]
        num = int(num)
        a = makexiang()
        a[num] = 1
        xiang.append([a])
        
    elif item[0] == '*':
        linshi = []
        bem = xiang.pop(-1)
        em = xiang.pop(-1)
        for a in bem:
            for b in em:
                linshi.append(multi(a,b))
        xiang.append(linshi)

    elif item[0] == '+':
        bem = xiang.pop(-1)
        em = xiang.pop(-1)
        xiang.append(em+bem)

    elif item[0] == '-':
        bem = xiang.pop(-1)
        em = xiang.pop(-1)
        for a in bem:
            a[0] *= -1
        xiang.append(em+bem)
       
    #print(xiang)

for l in range(m):
    line = input().split()
    dx = int(line[0])
    xlist = [int(i) for i in line[1:]]
    s = 0
    for p in xiang[0]:
        sp = p[0]
        #print(sp,end='  ')
        for shu in range(1,n+1):
            if shu == dx:
                if p[shu]==0:
                    sp = 0
                    continue
                sp *= p[shu]
                sp *= (xlist[shu-1]**(p[shu]-1))
                #print(xlist[shu-1],(p[shu]-1),sp,end = '  ')
                sp %= maxint
            else:
                sp *= (xlist[shu-1]**(p[shu]))
                #print(xlist[shu-1],(p[shu]),sp,end = '  ')
                sp %= maxint
        s += sp
        s %= maxint
        #print(sp)
    print(s)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值