题目描述
键盘输入一个高精度的正整数 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的情况