最大數字 題解 (刪除k個數字 貪心)

2022-09-07 18:36:17 字數 1170 閱讀 5473

時間限制: 1sec 記憶體限制: 128mb 提交: 104 解決: 27

題目描述

給你乙個整數 n,使得從 n 中刪除 k 個數字之後的數字最大。

輸入輸入乙個整數 n (0 <= n <= 10^100),和需要刪除數字 k <= 100的個數

輸出輸出刪除k個數字之後的最大整數

樣例輸入

1432219 3
樣例輸出

4329
提示無**

思路:通過貪心的方法。 根據題意, 就是刪除k個數字 保持原序列順序不變的情況 下,使得 剩下的數字組成的最大。

我們一般比較乙個數的大小,是怎麼比的 ,比如 8999 9000 ,是不是先看最高位,

第乙個數最高位為8 第二個數最高位為9,那麼後面根本就不用關心。所以乙個數大不大 由高位決定。

最高位相同,比次高位,依次類推。因此此題可以按以下步驟解決。

1.從最高位 開始找,找相鄰的兩個數中,高位的數字小於低位的數字,則應該把 高位的數字刪掉,

2.如果是乙個原序列是乙個遞減序列(或者 全為 11111 這種均勻序列),則刪除最後乙個元素就好了。

例如  1432219   要刪除 3個  先通過 人工刪除 肯定 刪除 兩個1 再刪 乙個2 就得到 最大數字, 4329。

分析一下 為什莫要這莫刪,

首先 刪去首位 的 1  因為 刪掉 1  最高位 就可以由原來的 1 變為 4,由 1***xx,變成了4***xx。多划算 對吧。

現在變成 432219 ,4比3 大 當然不能刪4 ,再比較3 和 2 當然也不能刪,再看2和2 ,也不能刪,看到 1 小於9 當然 刪掉1.

然後變成了43229, 按步驟來 看到 2小於9 ,就應該 刪掉2 。就變成了4329 同時也刪掉了3個數。

ac**:

#include#includeint main(){

char n[102];int k,i,t,len;

while(~scanf("%s%d",&n,&k)){

len=strlen(n);//獲取字串長度

while(k--){

for(i=0;i當然 還可以用鍊錶,更容易 刪除元素,同時 程式也更優,但是我還是喜歡 **簡潔的 哈哈哈

刪除K個數字,使剩下的數字串最大

題目 乙個n位的數,去掉其中的k位,問怎樣去掉使得留下來的那個 n k 位的數最大?分析 可以直接用貪心來求解,每次尋找從頭開始的連續遞減序列,刪除遞減序列的最後乙個元素,重複k次,最後剩下的數字串組成的數字最大。比如 13787323 第一次,遞減序列只有1,刪除1,得到3787323 第二次,遞...

藍橋杯 1972 最大數字

問題 1972 最大數字 時間限制 1sec 記憶體限制 128mb 提交 112 解決 32 題目描述 給你乙個整數 n,使得從 n 中刪除 k 個數字之後的數字最大。輸入輸入乙個整數 n 0 n 10 100 和需要刪除數字 k 100的個數 輸出輸出刪除k個數字之後的最大整數 樣例輸入 143...

刪除k個數字使剩下數字最小(大)

如 1593121212去掉3個數,剩下1121212最小。思路如下 刪除k個,可以採用貪心演算法,每次刪除1個 那麼每次刪哪乙個呢?此時我們已經能看出 要求剩下的數字最小,從左向右掃瞄,找出連續的非嚴格遞增串,刪除最後乙個 要求剩下的數字最大,從左向右掃瞄,找出連續的非嚴格遞減串,刪除最後乙個。核...