牛客在線編程-保留最大的數html
給定一個十進制的正整數number,選擇從裏面去掉一部分數字,但願保留下來的數字組成的正整數最大。python
輸入爲兩行內容,第一行是正整數number,1 ≤ length(number) ≤ 50000。第二行是但願去掉的數字數量cnt 1 ≤ cnt < length(number)。c++
輸出保留下來的結果。編程
325 1app
35spa
方法1. 由於想要最後剩下的數儘可能大,因此貪心地從前日後找到某位數比後一位小就刪掉這個數,可是這樣須要 O(n*m) (n 是總位數,m 是刪除的個數)。咱們能夠利用一個棧來達到 O(n)的時間複雜度:遍歷每一位,當還能刪除時且棧內的數比當前數小就出棧,直到棧內的數比當前數大,或者棧空,就將當前的數入棧。若是所有數都入過棧時還須要刪除,那就從棧頂刪。code
sta = [] #num = '0123456789' s = input() n = m = int(input()) for i in s: #while len(sta) != 0 and num.index(sta[-1]) < num.index(i) and m > 0: while len(sta) != 0 and sta[-1] < i and m > 0: m -= 1 sta.pop() sta.append(i) print (''.join(sta[:(len(s) - n)]))
方法2.htm
貪心的從頭開始日後面查找前一個數比後一個數小的相鄰兩數,刪除前面的數,當全部這種狀況都刪除,數字數量cnt還不爲0,從後面刪除剩餘cnt個數的數。blog
(若是選擇刪除所有0,再刪除所有1,再刪除所有2的方法,這種貪心策略是錯誤的。例如:3450 1,正確結果應該爲450)get
#include<bits/stdc++.h> using namespace std; const int maxn = 50005; char s[maxn]; int stk[maxn]; int main(){ int cnt,top = -1; scanf("%s %d",s,&cnt); int len = strlen(s); for (int i = 0;i < len - 1;i++){ if (s[i] >= s[i + 1] || !cnt){ stk[++top] = s[i] - '0'; }else if (cnt && s[i] < s[i + 1]){ cnt--; while (cnt && top >= 0 && stk[top] < s[i + 1] - '0'){ top--; cnt--; } } } stk[++top] = s[len - 1] - '0'; while (cnt){ cnt--; top--; } for (int i = 0;i <= top;i++){ printf("%d",stk[i]); } printf("\n"); return 0; } //https://www.cnblogs.com/zzy19961112/p/8525873.html