赞
踩
距离蓝桥杯还有29天 下面对执梗大哥给出的每日训练作出分析——所有题目均可在蓝桥官网找到
- def judge(x):
- p=str(x)
- for i in p:
- if int(i)%2==0:
- return False
- return True
-
-
- i=2019
- while True:
- if judge(i):
- print(i)
- break
- else:
- i+=2019
比较简单 遍历每一位 判断能否整除2 不能就是奇数
- s=[]
- for i in range(100):
- for j in range(100):
- for k in range(100):
- s.append(3**i*5**j*7**k)
-
- s.sort()
- print(s.index(59084709587505))
因为只有三种因子,不妨假设n=3^i*5^j*7^k 三重循环枚举所有可能即可 非常简单
- n=int(input())
-
- l=[0]*5000000
-
- for i in range(0,int(n**0.5)+1):
- for j in range(i,int(n**0.5)+1):
- if i**2+j**2<=n:
- l[i**2+j**2]=1
-
- def f(n):
- for i in range(0,int(n**0.5)+1):
- for j in range(i,int(n**0.5)+1):
- if l[n-i**2-j**2]==1:#tmp=n-(i**2+j**2)存在(i**2+j**2递增)
- tmp=n-i**2-j**2#待寻找的两数平方和
- for k in range(j,int(n**0.5)+1):#i<=j<=k<=p
- p=int((tmp-k**2)**0.5)**2#待判断数
- if p==tmp-k**2:#判断是否是完全平方数,右侧是目标数字的平方,左边是待判断数
- print(i,j,k,int(p**0.5))
- return 0
- f(n)
-
-
没有AC,75分,思路和cpp一样,但没过去,如果有更好的办法,恳请指导。下面对这种思路进行讲解,在cpp应该是能过的哈。假设n=x^2+y^2+z^2+p^2
先考虑两数的平方之和 把x^2+y^2<=n所有满足的整数解 记录下来 表示为1
其余表示为0的无非是其平方和>n或者无法用平方和表示出来(比如3就没法用两数平方和表示),不在考虑范围内
等于说现在我们已经有了一个数字 这个数字<=n,并可以用两数平方和表示
题目要求四数平方和,我们只需要在刚刚我们划分为1的数据内继续找两个
- s="""01010101001011001001010110010110100100001000101010
- 00001000100000101010010000100000001001100110100101
- 01111011010010001000001101001011100011000000010000
- 01000000001010100011010000101000001010101011001011
- 00011111000000101000010010100010100000101100000000
- 11001000110101000010101100011010011010101011110111
- 00011011010101001001001010000001000101001110000000
- 10100000101000100110101010111110011000010000111010
- 00111000001010100001100010000001000101001100001001
- 11000110100001110010001001010101010101010001101000
- 00010000100100000101001010101110100010101010000101
- 11100100101001001000010000010101010100100100010100
- 00000010000000101011001111010001100000101010100011
- 10101010011100001000011000010110011110110100001000
- 10101010100001101010100101000010100000111011101001
- 10000000101100010000101100101101001011100000000100
- 10101001000000010100100001000100000100011110101001
- 00101001010101101001010100011010101101110000110101
- 11001010000100001100000010100101000001000111000010
- 00001000110000110101101000000100101001001000011101
- 10100101000101000000001110110010110101101010100001
- 00101000010000110101010000100010001001000100010101
- 10100001000110010001000010101001010101011111010010
- 00000100101000000110010100101001000001000000000010
- 11010000001001110111001001000011101001011011101000
- 00000110100010001000100000001000011101000000110011
- 10101000101000100010001111100010101001010000001000
- 10000010100101001010110000000100101010001011101000
- 00111100001000010000000110111000000001000000001011
- 10000001100111010111010001000110111010101101111000"""
- maze=s.split('\n')#30行50列 maze[n][m] 0<=n<=29,0<=m<=49
-
-
-
- dy=[0,-1,1,0]
- dx=[1,0,0,-1]
-
- def judge(x,y):
- global parent,maze
- if 0<=x<=29 and 0<=y<=49 and maze[x][y]=='0' and (x,y) not in parent.keys():
- return True
- return False
-
-
- parent={(0,0):(0,0)}
- endx,endy=29,49
-
- searched=[(0,0)]
-
- def g(x1,y1,x2,y2):
- if x2-x1>0:
- return 'D'
- if x2-x1<0:
- return 'U'
- if y2-y1>0:
- return 'R'
- if y2-y1<0:
- return 'L'
- while searched:
- now=searched.pop(0)
- x,y=now[0],now[1]
- if x==endx and y==endy:
- end=(x,y)
- start=(0,0)
- t=''
- while parent[end]!=start:
- print(end)
- t=g(parent[end][0],parent[end][1],end[0],end[1])+t
- end=parent[end]
- t=g(parent[end][0],parent[end][1],end[0],end[1])+t
- print(t)
- break
- else:
- for i in range(4):
- nx,ny=x+dx[i],y+dy[i]
- if judge(nx,ny):
- parent[(nx,ny)]=(x,y)
- searched.append((nx,ny))
利用广度优先搜索 同时要记录路径 需要一个字典来记录前驱结点 每次出队的元素
对其合法邻居入队 何为合法邻居:在地图内,不是障碍物,没有创建过前驱关系(一个结点只能有一个parent)
有任何疑惑和建议欢迎提出 希望大家都能在这次蓝桥杯省赛中拿到省一!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。