刪數問題
time limit: 1000 ms memory limit: 65536 kib
problem description
鍵盤輸入乙個高精度的正整數n(≤100位),去掉其中任意s個數字後剩下的數字按照原來的左右次序組成乙個新的正整數。程式設計對給定的n與s,尋找一種方案,使得剩下的數字組成的新數最小。
input
輸入有多組 每組包括原始數n,要去掉的數字數s;
output
輸出去掉s個數後最小的數
sample input
178543 4
sample output
#include
#include
using
namespace
std;
int main()
//對字串零進行處理。
while(a[0]=='0'&&a.length()!=1)
a.erase(0,1);
cout
<< a << endl;
}return
0;}
首先,我們先要明確貪心演算法的核心,然後再來分析這個問題設定乙個正確的貪心演算法。
如何設計最小數呢?
我們先從廣義上理解這個。
1.當然是刪除最大的啦。
2.之後,將這些數字從小到大排列起來。
當這一串數字固定時如何來刪除呢?
1.思考乙個關鍵問題,對乙個數來講,其大小和什麼有關?難道僅僅是取決於最大數嗎?當然不是啦,而是取決於最高位的大小啊。
2.所以,對於乙個數來講,其每位數的最大值是次要的,而其數字所在的權位才是重要的。
3.好,既然談到權位,對於乙個相對位置已經固定下來的數字來講,如何讓它值最小呢?答案當然是盡量是權位越高的數字越小。
4.只要你理解上面的那句話,那麼表現在數字上是公升序排序,這是非常重要的。我們只要盡量保證這串數字是公升序排序,那麼就說明,在當下是最優選擇,如果刪除目前這位,那麼會導致後面的更大的數字來佔據這個權位,那麼這個數會變大。
5.還有一點,你是應該明確的,那就是,我們只能做到刪除數字,無法新增數字,也不能對數字的相對位置做出更改。所以,我們是當下的最優解,我們盡量保證是公升序即可,如果發現降序數字,我們就要刪除這個最大值,如 1 3 2 我們要刪除3,讓降序後面更小的數來補齊這個位,會讓數字變得更小。
6.所以,我們所做出的一切操作都是為了讓數字變得更小,當我們發現乙個降序,可以讓數字變的更小,所以,我們就要立刻行動起來,把更小的數掉到權更大的位來使數字變得更小,就是這個樣子,很好理解。
7.如果整個數字滿足公升序了,因為我們還要刪除數字,這時,我們應該刪除哪個呢?因為公升序,我們如果刪除其中的任何乙個,那麼後面的比它大的數來補上,權位會變大,這樣就會讓數變大!如何不用補呢?答案很簡單,就是對最後一位來進行刪除,所以這個整體的演算法就解決出來了。
對於c++,我們要明確如何刪除字串型別的單個字元,同時,我們還應該理解如何對零的處理,這個是有很多技巧的,比如10002刪除兩個數,最後應該為0,必須保證字串至少有乙個為乙個,就是這個意思,理解就好。
SDUT 2072 刪數問題
我做這個題了解到的是要注意的是刪除過程中可能會使原來包含0的數字串變成若干個以0開始的序列,當遇到數字串首位是0的時候,把高位的0去掉。鍵盤輸入乙個高精度的正整數n 100位 去掉其中任意s個數字後剩下的數字按照原來的左右次序組成乙個新的正整數。程式設計對給定的n與s,尋找一種方案,使得剩下的數字組...
ACM 刪數問題 SDUT 2072
刪數問題 time limit 1000ms memory limit 65536kb submit statistic discuss problem description 鍵盤輸入乙個高精度的正整數n 100位 去掉其中任意s個數字後剩下的數字按照原來的左右次序組成乙個新的正整數。程式設計對給...
SDUT 2072 刪數問題 貪心
time limit 1000ms memory limit 65536kb submit statistic discuss problem description 鍵盤輸入乙個高精度的正整數n 100位 去掉其中任意s個數字後剩下的數字按照原來的左右次序組成乙個新的正整數。程式設計對給定的n與s...