Just Do IT !

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

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

试题网站:http://oj.hzjingma.com/
@TOC

A. 试题A:完美车牌 5’

有一些数字可以颠倒过来看,例如0、1、8颠倒过来还是本身,6颠倒过来是9,9颠倒过来看还是6,其他数字颠倒过来不构成数字。

类似的,一些多位数也可以颠倒过来看,比如106颠倒过来是901

假设某个城市的车牌只由6位数字组成,每一位都可以取0到9。请问这个城市最多有多少个车牌180°180°倒过来恰好还是原来的车牌?

例如:车牌号:886988,倒过来还是886988

【答案提交】

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ans = 0
for i in range(1, 1000000):
i = str(i).zfill(6) # 补充前导0
if '2' in str(i) or '3' in str(i) or '4' in str(i) or '5' in str(i) or '7' in str(i):
continue
else:
s = str(i)
s1 = ''
for i in range(6):
if s[5-i] == '6':
s1 += '9'
elif s[5-i] == '9':
s1 += '6'
else:
s1 += s[5-i]

if s == s1:
ans += 1
print(s)
print(ans)

B. 试题B:完美日期 5’

不知天上宫阙,今夕是何年。

对于完美日期yyyy/mm/dd,wlxsq的定义是:

年月日中均没有出现数字4,
年月日的数位之和是8的倍数
例如:2020/02/02 就是一个完美日期,没有出现数字4,且数位之和是8的倍数。

wlxsq想知道从2020/02/02开始,第88个完美日期是哪个?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个格式yyyy/yy/dd,在提交答案时直接填写这个日期,注意需要如果答案有前导零则不能忽略,填写多余的内容将无法得分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
y = 2020
m = 2
d = 2
day_ = [0, 31,28,31,30,31,30,31,31,30,31,30,31]
ans = 0
while ans <= 87:
if '4' not in str(y) and '4' not in str(d) and '4' not in str(m):
if d >= 10:
if (y+m+int(str(d)[0])+(int(str(d)[1]))) % 8 == 0:
ans += 1
print(ans)
print(y, m, d)
else:
if (y+m+d)%8 == 0:
ans += 1
print(ans)
print(y, m, d)
d += 1
if d > day_[m]:
d = 1
m += 1
if m > 12:
m = 1
y += 1

C. 试题C:天机锁10’

描述
【问题描述】

天机锁,锁天机~

wlxsq在机缘巧合的情况下就获得一把天机锁。wlxsq迫不及待的想打开这把锁。该锁的密码是由八个数字构成的,每个数字都是[0,9]中的一个~

锁上面写道:

水(数字9)火(数字4)相生相克,同现同隐(要么都出现,要么都不出现),数量一致(且出现则数量得一样多)。
土(数字2)乃大地,为伊始(数字2一定出现)。
世间万物,不过五二(八个数字之和不超过52)。
此乃天机,一日一次之~
由于天机锁一天只能试一次,wlxsq想知道,总共有多少种方案~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ans = 0
for i in range(0, 100000000):
s = str(i)
s = s.zfill(8)
if '2' in s:
if '4' in s and '9' in s and s.count('4') == s.count('9'):
if int(s[0])+int(s[1])+int(s[2])+int(s[3])+int(s[4])+int(s[5])+int(s[6])+int(s[7]) <= 52:
ans += 1
print(i)
else:
continue
elif '4' not in s and '9' not in s:
if int(s[0])+int(s[1])+int(s[2])+int(s[3])+int(s[4])+int(s[5])+int(s[6])+int(s[7]) <= 52:
ans += 1
print(i)
else:
continue
else:
continue
print(ans)

D. 试题D:完美运算 10‘

在这里插入图片描述
思路:算出全部情况和A=B的情况,最后(全部情况-A=B情况)/2+A=B情况

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
def f(n):
x = 3
#n为待转换的十进制数,x为机制,取值为2-16
a=[0,1,2,3,4,5,6,7,8,9,'A','b','C','D','E','F']
b=[]
while True:
s=n // x # 商
y=n % x # 余数
b=b+[y]
if s==0:
break
n=s
b.reverse()
ans = ''
for i in b:
ans += str(a[i])
return ans

if __name__ == '__main__':
ans = 0
ans2 = 0
for i in range(1, 2021):
for j in range(1, 2021):
a1 = f(i).count('1')
a2 = f(i).count('2')
b1 = f(j).count('1')
b2 = f(j).count('2')
if abs(int(a1)-int(a2)) == abs(int(b1)-int(b2)):
ans += 1
if i == j:
ans2 += 1
print(ans)
print(ans2)

F. 试题F:JM斗牛 17’

描述
JM打完麻将,觉得太简单了,所以决定去斗牛,挑战一下高难度。

一副牌共54张牌,即采用牌大王(1张),小王(1张),K,Q,J,10,9,8,7,6,5,4,3,2,A。除了大小王,其余牌型均为4张。故4*13+2=54张

斗牛则是每人5张牌,计算5张牌的构成的点数,然后比较点数大小。

关于点数计算:

大王(S),小王(S),K,Q,J都当成是10点,A当成是1点,其余牌都当其本身的点数。 大王,小王均用大写字母S表示
每位玩家5张牌,玩家用手上任意的3张牌组合(且只能用3张牌组成10的倍数),使其点数之和为10的倍数,这样就称之为“牛”。
然后将剩余的2张牌点数之和取个位数,如这2张牌之和也为10的倍数,则组成“牛牛”牌型。如这2张牌之和不为10的整数倍,则去掉十位数之后个位数为几,则成为“牛几”牌型。
如任意三张牌组合的点数之和都不能成为10的倍数,则称之为“无牛”牌型。
例如:

牛牛牌型:选取的3张牌之和为10的整数倍,余下2张牌之和也为10的整数倍。例:A,9,10,J,Q.选取(A,9,J)和为10的整数倍,(10,Q构成)牛牛

牛九牌型:选取的3张牌之和为10的整数倍,余下2张牌之和的个位数为9。例:A,9,10,J,9。   

牛八牌型:选取的3张牌之和为10的整数倍,余下2张牌之和的个位数为8。例:A,9,10,J,8。

牛七牌型:选取的3张牌之和为10的整数倍,余下2张牌之和的个位数为7。例:A,9,10,J,7。选取(A,9,J)和为10的整数倍,(10,7构成)牛七

无牛牌型: 任意选取的3张牌之和均不可能为10的整数倍例:A,9,8,9,7。

JM会打麻将,但是不怎么会斗牛,想请你帮忙编写程序帮忙计算一下,JM 拿到的牌是什么牌型。
样例

输入
A 2 3 5 S
输出
1
输入
S S A 8 8
输出
so sad!
输入
S S J Q K
输出
so cool!
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
def solve(list):
for i in range(5):
for j in range(i + 1, 5):
for k in range(j + 1, 5):
if (list[i] + list[j] + list[k]) % 10 == 0:
num1 = list[i]
num2 = list[j]
num3 = list[k]
list.remove(num1)
list.remove(num2)
list.remove(num3)
if (list[0] + list[1]) % 10 == 0:
str1 = "so cool!"
return str1
else:
return (list[0] + list[1]) % 10

else:
continue
else:
str2 = "so sad!"
return str2

if __name__ == '__main__':

str = input()
str = str.replace('A','1')
str = str.replace('S','10')
str = str.replace('K','10')
str = str.replace('Q','10')
str = str.replace('J','10')
list = list(str.split())
for i in range(len(list)):
list[i] = int(list[i])

ans = solve(list=list)
print(ans)

H. 试题H:宝剑锋从磨砺出 20’

在这里插入图片描述
思路: k减去所有材料的p2,然后找到最大的p1去处理k

样例

输入
1 10 
3 5
输出
3
输入
2 10
3 5
2 6
输出
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
n,k = map(int, input().split())
ans = 0
list1 = []
list2 = []
for i in range(n):
a,b = map(int, input().split())
list1.append(a)
list2.append(b)
list1 = sorted(list1)
list2 = sorted(list2)
while list2 and list2[-1] > list1[-1] and k > 0:
k -= list2[-1]
list2.pop()
ans += 1
if k > 0:
ans += k // list1[-1] + 1
print(ans)
CATALOG
  1. 1. A. 试题A:完美车牌 5’
  2. 2. B. 试题B:完美日期 5’
  3. 3. C. 试题C:天机锁10’
  4. 4. D. 试题D:完美运算 10‘
  5. 5. F. 试题F:JM斗牛 17’
  6. 6. H. 试题H:宝剑锋从磨砺出 20’