Just Do IT !

Python算法学习: 竞码编程-蓝桥杯模拟赛题解

字数统计: 1k阅读时长: 4 min
2020/02/23 Share

昨天闲来无事在一个oj网站上做了几道模拟赛的题,写此博客记录一下

A:战疫情 5’

【问题描述】

为抗击新型冠状病毒感染的肺炎疫情,爱心人士小李花费50000元人民币购买x只口罩,y套防护服。已知x+y的和在区间[20000,21000].

请问有多少种购买方案,是刚好花费50000元人民币的!

已知口罩价格2元/只,防护服价格100元/套。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。

1
2
3
4
5
6
7
8
sum = 0
for x in range(21001):
for y in range(21001):
if 20000 <= x+y <= 21000 and ((2*x) + (100*y)) == 50000:
sum += 1
print(x, y, sum)
else:
continue

B:行动 5’

在这里插入图片描述

【问题描述】

小明站在坐标(0, 0)处,面朝 x轴正方向。第一轮,他向前走 1单位距离,然后右转;第二轮,他向前走 2单位距离,然后右转;第三轮,他向前走 3单位距离,然后右转……他一直这么走下去。请问第 2020轮后,他的坐标是:(__)。

题解:

这个题目手算很简单!总共2020步,每44步一圈,每一圈横坐标-2,纵坐标+2。刚好505圈.

当然这个题目也可以用循环,循环2020次。

在第ii次循环,

如果i\%4=1,则x+i

如果i\%4=2,则y-i

如果i\%4=3,则x-i

如果i\%4=4,则y+i

答案:-1010 1010

C:莱布尼茨公式 10’

在这里插入图片描述

1
2
3
4
5
6
7
8
9
numerate : float = 4.0
denominator : float = 1.0
operation : float = 1.0
PI = 0
for i in range(1, 2021):
PI += operation * (numerate / denominator)
denominator += 2
operation *= -1
print('%.6f' % PI)

D:价值之和 10’

【问题描述】

定义数字x的价值为其不同质因子的个数。

例如:数字2020可以写成2020=225*101其价值为3

JM boy请你帮忙计算整数1到2020中,所有都不包含数字5的正整数的价值之和。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数(提示:答案最后一位数是奇数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def get_num_factors(num):
list = []
tmp = 2
if num == tmp:
list.append(tmp)
else:
while num >= tmp:
k = num % tmp
if k == 0:
if tmp not in list: # 去重
list.append(tmp)
num = num / tmp
else:
num = num / tmp
else:
tmp += 1
len_list = int(len(list))
return len_list

if __name__ == '__main__':
sum = 0
for i in range(1, 2021):
if '5' not in str(i):
sum += get_num_factors(i)
# print(i)
else:
continue
print(sum)

E:数方 15’

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
def is_pingfang(n):
for i in range(2, 32):
if pow(i, 2) == n:
return True
else:
continue
def is_lifang(n):
for i in range(2, 10):
if pow(i, 3) == n:
return True
else:
continue

def is_sifang(n):
for i in range(2, 6):
if pow(i, 4) == n:
return True
else:
continue

def is_huiwen(n):
if str(n) == str(n)[::-1]:
return True
else:
return False
def is_sanjiao(n):
for i in range(1, 46):
n -= i
if n == 0:
return True
else:
continue
def is_zhishu(n):
flag = True
for i in range(2, n):
if n % i != 0:
continue
else:
flag = False
break
return flag



if __name__ == '__main__':
for a in range(1, 10):
for b in range(1, 10):
for c in range(1, 10):
for d in range(1, 10):
for e in range(1, 10):
for f in range(1, 10):
for g in range(1, 10):
for h in range(1, 10):
for i in range(1, 10):
if is_lifang(int(str(a)+str(b)+str(c))) and is_zhishu(int(str(d) + str(e) + str(f))) and is_pingfang(int(str(g) + str(h) + str(i))) and is_sanjiao(int(str(a) + str(d) + str(g))) and is_sifang(int(str(b) + str(e) + str(h))) and is_huiwen(int(str(c) + str(f) + str(i))):
print("正确答案:")
print(a, b, c, d, e, f, g, h, i)
break
else:
continue

G:最优值 18’

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def main():
n = int(input())
ans = 0
anslist = []
for i in range(n):
word = input()
len_word = len(word)
anslist.append(((ord(word[0])-96))*len_word)
anslist = sorted(anslist)
for i in range(n):
ans += anslist[i]*(i+1)
print(ans)
if __name__ == '__main__':
main()

H:计算器 22’

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def solve(eq,var='x'):
eq1 = eq.replace("=","-(")+")"
eq1 = eq1.replace("x","*x")
eq1 = eq1.replace("+*x","+x")
eq1 = eq1.replace("-*x","-x")
eq1 = eq1.replace("(*x","(x")
if eq1[0] == '*':
eq1 = eq1[1:]
c = eval(eq1,{var:1j})
if c.real!=0:
return -c.real/c.imag
else:
return 0
test = input()
ch = 'x'
for i in range(len(test)):
if 97 <= ord(test[i]) <= 122:
ch = test[i]
test = test.replace(test[i],'x')
break
print("%s=%.3lf"%(ch,solve(test)))

CATALOG
  1. 1. A:战疫情 5’
  2. 2. B:行动 5’
  3. 3. C:莱布尼茨公式 10’
  4. 4. D:价值之和 10’
  5. 5. E:数方 15’
  6. 6. G:最优值 18’
  7. 7. H:计算器 22’