CSP认证2022-06:归一化处理、寻宝!大冒险!、角色授权,python满分解答代码

第26次CCF计算机软件能力认证前三题:归一化处理、寻宝!大冒险!、角色授权,python满分解答代码。

目录

一、归一化处理

题目背景

样例输入

样例输出

思路

代码

二、寻宝!大冒险!

题目背景

样例输入

样例输出

思路

代码

三、角色授权

问题背景

思路

代码

结果

总结


一、归一化处理

题目背景

在机器学习中,对数据进行归一化处理是一种常用的技术。将数据从各种各样分布调整为平均值为 0、方差为 1 的标准分布,在很多情况下都可以有效地加速模型的训练。

样例输入

7
-4 293 0 -22 12 654 1000

样例输出

-0.7485510379073613
0.04504284674812264
-0.7378629047806881
-0.7966476369773906
-0.7057985054006686
1.0096468614303775
1.9341703768876082

思路

若是能导包,用numpy库一下就做出来了,不过csp认证不允许导包,所以就按照定义来就行,送分题。

代码

import math

n=int(input())
nums=input()
nums=[int(x) for x in nums.split(" ")]
a_=sum(nums)/n
cov=0
for i in range(n):
    cov+=(nums[i]-a_)**2
fengmu=(cov/n)**0.5
for x in nums:
    print((x-a_)/fengmu)

#score : 100

二、寻宝!大冒险!

题目背景

暑假要到了。可惜由于种种原因,小 P 原本的出游计划取消。失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期……直到……

某天,小 P 获得了一张神秘的藏宝图。

样例输入

5 100 2
0 0
1 1
2 2
3 3
4 4
0 0 1
0 1 0
1 0 0

样例输出

3

思路

题目看上去文字描述挺多的,其实还是挺简单的一题。

1.首先可以看成藏宝图在地图上移动,移动方式当然是在地图上A[i][j]=1的点上移动(特别地,藏宝图左下角位置一定是一棵树,即 A[x][y]=B[0][0]=1,表示了宝藏埋藏的位置。)

2.理论上,绿化图 A 中存在着一处坐标 (x,y)(0≤x,y≤L−S)与藏宝图 B 左下角 (0,0) 相对应,即满足:
对 B 上任意一处坐标 (i,j)(0≤i,j≤S),都有 A[x+i][y+j]=B[i][j]。

当然藏宝图的点必须对应在地图上,即x+i,y+j不能超过地图边界

3.绿化图上的点与藏宝图的点必须一一对应,比如绿化图上的点为1,藏宝图上的点也必须为1;绿化图上的点为0,藏宝图上的点也必须为0,否则按照规则1进行移动。这里我们可以用到异或,1^0=1,0^1=1,0^0=0,1^1=0,遍历藏宝图上的点就行。

代码

代码如下:

#读取数据
n,L,S=map(int,input().split())
points=[[i for i in map(int,input().split())] for j in range(n)]
temp={}
for point in points:
    x,y=point[0],point[1]
    temp[(x,y)]=1
money=[]
for i in range(S+1):
    money.insert(0,list(map(int,input().split())))
time=0
# 遍历地图所有带树的点
for x,y in points:
    #设置标志,若为0表示藏宝图找到了对应点,反之该点不对
    flag=0
    # 遍历藏宝图上的所有点
    for i in range(S+1):
        for j in range(S+1):
            # 超过边界,退出
            if (x+i>L) or (y+j>L):
                flag=1
                break
            if money[i][j]^((x+i,y+j) in temp):
                flag=1
                break
        if flag==1:#移动到下一点
            break
    if flag==0:
        time+=1
print(time)

三、角色授权

问题背景

思路

直接用字典存储角色、用户、用户组之间的关系即可,需要用的时候进行字典查询即可

代码

class juese():
    def __int__(self):
        self.nv = None
        self.no = None
        self.nn = None
juese_guanlian_dict ={}#key为用户或用户组(u_ops,g_res)之类的,value为角色列表
n,m,q = list(map(int,input().split()))
juese_dict = {}
for i in range(n):
    juese_message = input().split()
    juese_name = juese_message[0]
    juese_obj = juese()#创建一个角色对象
    # 正整数nv
    nv_int = int(juese_message[1])
    nv = juese_message[2:2+nv_int]
    no_int = int(juese_message[2+nv_int])
    no = juese_message[2+nv_int+1:2+nv_int+1+no_int]
    nn_int = juese_message[2+nv_int+1+no_int]
    nn = juese_message[2+nv_int+1+no_int+1:]
    #给角色对象赋值
    juese_obj.nv=nv
    juese_obj.nn=nn
    juese_obj.no=no
    juese_dict[juese_name]=juese_obj
#输入角色关联数据
juese_guanlian = {}
for i in range(m):
    juese_guanlian_message = input().split()
    juese_guanlian_juese_name = juese_guanlian_message[0]#角色关联中角色的名称
    # juese_guanlian_dict[juese_guanlian_name]=[]
    ns_int = int(juese_guanlian_message[1])#正整数
    index = 2
    while index<len(juese_guanlian_message):
    #接下来2ns个
        u_or_g = juese_guanlian_message[index]
        name = juese_guanlian_message[index+1]
        u_g_name = u_or_g+'_'+name
        if not juese_guanlian_dict.get(u_g_name):
            juese_guanlian_dict[u_g_name] = []
        juese_guanlian_dict[u_g_name].append(juese_guanlian_juese_name)
        index+=2
for k in range(q):
    query = input().split()
    username = query[0]
    ng_int = int(query[1])
    group = ['u_'+username]#把用户名字写入group中
    for r in range(ng_int):
        group.append('g_'+query[2+r])#存入用户组名字
    op_name = query[2+ng_int]
    op_class = query[2+ng_int+1]
    source_name = query[2+ng_int+2]


    #开始计算,首先获得关联角色,因为只有角色才有资格执行操作
    #通过用户和用户组去获得角色
    juese_list = []#角色集合
    for g in group:
        if juese_guanlian_dict.get(g):#存在则继续
            juese_list.extend(juese_guanlian_dict[g])
    juese_set = set(juese_list)


    #拿到了所有的角色清单,执行以下操作,以判断是否能够对资源进行访问
    exe = 0#是否能执行操作
    for juese in juese_set:
        juese_obj = juese_dict[juese]
        caozuo = juese_obj.nv
        ziyuan_zhonglei = juese_obj.no
        ziyuan_mingcheng = juese_obj.nn
        #首先判断操作
        if (op_name in caozuo or '*' in caozuo) and (op_class in ziyuan_zhonglei or '*' in ziyuan_zhonglei) and (len(ziyuan_mingcheng)==0 or source_name in ziyuan_mingcheng):
            exe=1
    print(exe)

结果

用时有亿点点多,^_^

总结

本次csp认证前三题难度较往年简单很多了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值