3002 刪去K個數字

2021-09-28 10:05:21 字數 1282 閱讀 4163

time limit: 3 second

memory limit: 2 mb

輸入乙個數字串s和整數k(k小於數字串s的長度),從s中刪去k個數字,使剩餘數字在保持相對位置不變的情況下構成乙個值最小的整數。例如:s='19990608',k=4,處理結果為608。如果串s含有非數字字元,則輸出'error',如果k的值大於串s的長度,則輸出'error'。

兩行,第一行為數字串s,第二行為整數k。

一行,處理結果或error

19990608

4

608
【題解】

這是一道貪心題。

先考慮一種比較簡單的情況。

123456,接下來 刪除乙個數字。

如果刪掉1 就是2 開頭了

這顯然不是最小的,因為我們可以刪掉2,那這個數字就是1開頭的了,但刪掉2第二位是3,如果刪掉3 第二位就是2 這樣更優。。。

如此如此可以知道 刪掉6是最優的情況。

再來複雜點

489456 這裡就不能單純地刪掉6了。我們可以把它分成兩個部分

489 和 456 如果單純対這兩個數做刪除操作 我們可以容易地得到答案。

那麼問題來了,我們應該刪掉9還是刪掉6呢?

答案是9,因為如果我們讓後者更小,最後結果是489***

而如果讓前者更小,最後結果則是484***,顯然讓前者更小是更優的解法。

或者你可以把這489和456看成x和y,然後把這兩個數組成乙個2位數

最後的結果是x*10+y,那讓x更小顯然是更優的解。

如果是484950這個 就把 48 和49 和50 看成x,y,z顯然也是讓x最小是最優的解。

就是這樣吧。

這裡的9和6是兩個遞增區間的最後乙個數字。

while (a[i] <= a[i+1]) i ++ ,這樣找到i,然後用erase刪掉就好。

不要忘記去除開頭可能多餘的0;

【**】

#include #include #include #include using namespace std;

string s1;

int n,k;

void s_p()

void input_data()

}void get_ans()

int m = s1.size();

int i = 0;

while (m > 1 && s1[i] == '0') //刪掉開頭多餘的0

}void output_ans()

int main()

刪去k個數字後的最小值

參考 程式設計師小灰 substring 方法返回字串的子字串。語法public string substring int beginindex 或public string substring int beginindex,int endindex 引數beginindex 起始索引 包括 索引從...

刪去k個數字後的最小值(貪心演算法思想實現)

題目 給出乙個整數,從該整數中去掉k個數字,要求剩下的數字形成的新整數盡可能小。解題思路 實現 刪除整數的k個數字,獲得刪除後的最小值 param num 原整數 param k 刪除數量 return 返回刪除後的最小值 public static string removekdigits str...

最小的k個數字

題目 輸入n個整數,找出其中最小的k個數。例如輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1 2 3 4。方法一 根據陣列特點找出時間複雜度為o n 的演算法 include includeusing namespace std int randomofrange int sta...