蓝桥杯 2022 国赛 《最大数字》

前言

这道题我一看是个简单,直接上来就是从最高位开始模拟,使用贪心算法。结果不通过,其实这道题不仔细观察会掉坑里。

解题思路:

1. 从 N 的高位开始遍历,因为我们只要保证前面最大化就能保证这个数是最大的。

        1. A 和 B 都能保证数字最大化,那么我们就将这两种可能性保存下来

        2. 只有A 或者 B 能保证数字最大化,那么直接使用这个数即可

代码实现:

递归

from math import inf

In = input().split()
num, A, B = In[0], int(In[1]), int(In[2])
ans = -inf


def dfs(num, A, B, idx):
    global ans
    if idx > len(num) - 1:
        return
    k1 = k2 = int(num[idx])
    cnt1 = 9 - k1 if A >= 9 - k1 else A
    cnt2 = k2 + 1 if B >= k2 + 1 else 0

    ans1 = num[:idx] + str(k1 + cnt1) + num[idx + 1:]
    ans2 = num[:idx] + str(9) + num[idx + 1:] if cnt2 != 0 else num

    ans = max(ans, int(ans1), int(ans2))

    dfs(ans1, A - cnt1, B, idx + 1)
    dfs(ans2, A, B - cnt2, idx + 1)


dfs(num, A, B, 0)
print(ans)

队列

# 队列写法
from math import inf
from collections import deque

In = input().split()
num, A, B = In[0], int(In[1]), int(In[2])
ans = -inf

q = deque()
q.append((num, A, B))

# 从高位遍历 num 下标
for idx in range(len(num)):
    result = deque()
    while q:
        N, A, B = q.pop()
        k1, k2 = int(N[idx]), int(N[idx])

        cnt1 = 9 - k1 if A >= 9 - k1 else A
        cnt2 = k2 + 1 if B >= k2 + 1 else 0

        ans1 = N[:idx] + str(k1 + cnt1) + N[idx + 1:]
        ans2 = N[:idx] + str(9) + N[idx + 1:] if cnt2 != 0 else N

        ans = max(ans, int(ans1), int(ans2))
        # 因为当 A 和 B 都能选的时候会导致后续的不确定性,所以将两种可能都保存
        result.append((ans1, A - cnt1, B))
        result.append((ans2, A, B - cnt2))
    q = result
print(ans)

这两种写法我更偏向于队列,因为可读性更高

总结:

实现的算法不是最好的,还可以进行优化。

读题不够认真导致 wa 了4次,最后才完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值