第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认证前三题难度较往年简单很多了。