迅雷2018/9/12 笔试【附思路】
1. 互质勾股数
只过了 86,求大佬指点
思路1:暴力
维护一个数组,数组的第 i 位保存, i^2
然后暴力判断即可。。
思路2:找规律
见代码
import math
"""
假设勾股数满足 a^2 = b^2 + c^2, a, b, c互质
那么有 b^2 = (a+c)(a-c) 且 a b c一定是两奇数一偶数
其中 a+c 和 a-c 一定是 m^2 和 n^2 ,并且 m n 互质
下面的结论证明比较复杂,之前做题的时候看过这个证明。
简单说下上面的证明: 3 偶数,不行; 2偶数,不行,0 偶数,不行;只能是一奇数两偶数
有了这个结论,只需要一个数组保存某些数是否访问过,并且做一些边界判断即可.
然后寻找复合条件的 m 和 n,并把符合条件的a b c的倍数置为 True
"""
def gcd(a, b):
return a if b == 0 else gcd(b, a % b)
is_visited = [False for i in range(10 ** 7)]
def get_result(number):
result = 0
n_sqrt = int(math.sqrt(number))
for i in range(1, n_sqrt + 1):
for j in range(i + 1, number, 2):
if i ** 2 + j ** 2 > number:
break
if gcd(i, j) != 1:
continue
result += 1
minus = j ** 2 - i ** 2
mul = 2 * i * j
add = i ** 2 + j ** 2
tmp_vis = 1
while add * i <= number:
is_visited[mul * tmp_vis] = is_visited[add * tmp_vis] = is_visited[minus * tmp_vis] = True
return result
if __name__ == '__main__':
while True:
number = input()
if not number:
break
number = int(number)
print(get_result(number)) 2.数组最大和
给定一个正数和一个负数,相邻的 7 个元素之和小于0,求数组最大和。
思路见代码或参考:
https://www.nowcoder.com/discuss/108052?type=2&order=0&pos=5&page=1
# encoding: utf-8
import math
def get_result(pos, neg):
array = [0 for i in range(17)]
# 找到连续 7 个元素最大可以有多少正数
max_pos = 0
for i in range(8):
j = 7 - i
if pos * i + neg * j < 0:
max_pos = i
else:
break
# 可以想象有这么一个滑动窗口,每次向右滑动一个位置。从左边去掉一个,右边补充一个相同的元素。
# 那么问题实质是一个贪心问题,怎么使补充的元素是正数的数量最多? 因此需要把最开始的 7 个元素,按照左边是正数,右边是负数的顺序排列
# 然后依次重复就好了,剩下的 17 - 2*7 = 3 个元素,判断最多正数的数量和这个的大小即可。
if max_pos >= 3:
pos_num = 2 * max_pos + 3
else:
pos_num = 2 * max_pos + max_pos
return pos_num * pos + (17 - pos_num) * neg
if __name__ == '__main__':
while True:
line = input()
if not line:
break
pos, neg = list(map(int, line.strip().split()))
print(get_result(pos, neg))#迅雷#