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

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

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

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

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

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

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

【答案提交】

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

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,在提交答案时直接填写这个日期,注意需要如果答案有前导零则不能忽略,填写多余的内容将无法得分。
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想知道,总共有多少种方案~

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情况

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!
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
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)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值