洛谷P1106 删数问题

题目描述

键盘输入一个高精度的正整数 NN(不超过 250250 位),去掉其中任意 kk 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 NN 和 kk,寻找一种方案使得剩下的数字组成的新数最小。

输入格式

nn(高精度的正整数 )。

kk(需要删除的数字个数 )。

输出格式

最后剩下的最小数。

与最小新整数很像,下面是思路链接

http://blog.csdn.net/c20190102/article/details/52350828

再来个图看的更清楚

每个线的高度代表数的大小,两个数的大小取决于每个数最前面一位上数的大小 (如 2189 3200)。只要排前面的大那么这个数就大,要想最大程度减小他就是把最前面最大的数删了。

像图中如果只是删掉最大的数,而不看它的位置,那么就要删掉第8个数,此时决定大小的是第 1,2,3..(前两位是 第一个 第二个),如果把第二个数删掉,决定大小的就是 1,3,4...(前两位是 第一个 第三个),显然是第二种删法得到的数更小

经过这种删法之后得到的就是一个递增的序列,此时如果还要删就要从后面开始删,这样才是得到最小的数

n = input()
lst = []
for i in range(len(n)):
    lst.append(int(n[i]))
k = int(input())
while k:
    flag = 1     # 判断是否为递增序列(在下面判断)
    for i in range(len(lst)-1):
        if lst[i]>lst[i+1]:   # 如果不是递增就删掉前面一个
            lst.pop(i)
            k-=1
            flag = 0
            break     # 删一次停一次是因为lst长度变化,如果不停i会超出去
    if flag == 1:    # 如果前面没删,说明已经是递增序列
        break
for i in range(k):   # 递增序列从后开始删
    lst.pop()
s = ''
for i in lst:     # 把lst里的数全拿出来拼成一个新的字符串
    s += str(i)
print(int(s))     # 再将字串转成数,可以避免前导有0的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在北京挖石油的日子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值