P1106 刪數問題

2021-10-14 12:35:32 字數 1478 閱讀 3150

題目描述

鍵盤輸入乙個高精度的正整數 n(不超過 250 位),去掉其中任意 k 個數字後剩下的數字按原左右次序將組成乙個新的非負整數。程式設計對給定的

n和 k,尋找一種方案使得剩下的數字組成的新數最小。

輸入格式

n(高精度的正整數 )。

k(需要刪除的數字個數 )。

輸出格式

最後剩下的最小數。 輸入輸出樣例

輸入

175438 4

輸出

此題先看看思路:

這並不是僅僅刪除最大的數這麼簡單,而需要盡可能刪除高位上的數使這個數整體最小,如果這個數從左往右每一位的數越來越大,當然隨意刪除一位都會使這個數變大。

但是,如果這個數是18394,將8刪除,卻可以使這個數整體減小,由此發現,我們只要刪除「峰」即c[i]>c[i+1],會使這個數減小。

再來幾個例子:

第一組:

1 5 1 9

小大 小 大

留刪 留 留

第二組:

1 4 1 5 1 9

小 大 小 大 小 大

留 刪 留 刪 留 留

刪掉的是「山峰」,也就是比後乙個數大的數,且越靠前「山

峰」越早刪。

大體思路也就一句話:刪除靠前的「山峰」。

另外,有幾個坑不得不提:

1.注意刪除前導0(雖然它說每個數字都不為0,但是測試資料裡面好像有這樣的資料)。

2.刪過乙個數記得長度len–。

3.有多組資料(其實陣列可以不清零,因為有len控制查詢範圍)。

4.當把數刪為0(見資料4)時,要輸出0。

輸入 輸出

133420 3 120

1444 3 1

20018 2 1

10000 1 0

題解

#include

using

namespace std;

char c[

260]

;int len,s;

intmain()

break;}

} len--;}

int i =0;

while

(i<=len-

1&&c[i]

=='0'

)i++

;//處理前導0

if(i==len)cout <<

"0"<< endl;

//全部是0

else

return0;

}

P1106 刪數問題

傳送門 這道題問給出乙個數字 n位 問刪去任意k位使其剩下位數組成的數字最小 一開始我是覺得刪掉前k大的位數,顯然是不對的。例如,1649,我們刪掉9,那麼結果就為164,如果我們刪掉6就是149,顯然後面的更小的。看了題解才會做,我們要一直找s i s i 1 的數並刪掉,並且肯定能找到,中間找不...

P1106 刪數問題

題目描述 鍵盤輸入乙個高精度的正整數n 不超過250位 去掉其中任意k個數字後剩下的數字按原左右次序將組成乙個新的正整數。程式設計對給定的n和k,尋找一種方案使得剩下的數字組成的新數最小。輸入格式 n 高精度的正整數 k 需要刪除的數字個數 輸出格式 最後剩下的最小數。輸入輸出樣例 輸入175438...

P1106 刪數問題

題目描述 鍵盤輸入乙個高精度的正整數 nn 不超過 250250 位 去掉其中任意 kk 個數字後剩下的數字按原左右次序將組成乙個新的非負整數。程式設計對給定的 nn 和 kk,尋找一種方案使得剩下的數字組成的新數最小。輸入格式 nn 高精度的正整數 kk 需要刪除的數字個數 輸出格式 最後剩下的最...