4-2 刪數問題 (30 分)
給定n位正整數a,去掉其中任意k≤n 個數字後,剩下的數字按原次序排列組成乙個新的正整數。對於給定的n位正整數a和正整數 k,設計乙個演算法找出剩下數字組成的新數最小的刪數方案。如果數字最前面有0不輸出。
第 1 行是1 個正整數 a。第 2 行是正整數k。
輸出最小數。
在這裡給出一組輸入。例如:
178543
4
5001
1
123456
2
109
1
在這裡給出相應的輸出。例如:
13
1
1234
9
我的**為
1 #include2using
namespace
std;
3int
main()419
break;20}
21}22 tihuan--;23}
24int j=0;25
while(b[j]=='
0'&&j26 j++;
27if(j==tihuan)
28 cout<<'0'
;29else
3034
return0;
35 }
這題運用了演算法中貪心演算法的知識,貪心策略為前面的乙個數要小於後面的乙個數,若違反這個規定,則將前面的那個大的數給剔除。
在我看來這一題存在的難點有三個
1.尋找本題對應的貪心策略
2.刪除所要刪除的數後若該串數字的最前面是0的話用什麼方法把0去掉最好
3.若刪除了所有的數字後,該怎麼辦
在寫**的過程中,出現了乙個大家可能都會犯的小錯誤
如果像我一樣使用了巢狀for迴圈來從開頭尋找要被刪除的數字,在刪除了那個數字後並將後面的數字提到前面之後一定要加個break來跳出這層for迴圈,不然的話for迴圈會繼續從已被刪除的數字的位置開始繼續進行刪除數字的迴圈,而不是重新開始。
時間複雜度為o(k*n的平方) 空間複雜度為o(n)
我對貪心演算法的理解就是:貪心演算法是一種極端的演算法,不像動態規劃和分治法那樣穩紮穩打,在用貪心演算法求解問題時,一定要找準貪心策略(多列幾種貪心策略,然後逐一排除選擇最好的那一種),找準之後便可做題。
演算法第四章上機實驗報告
實踐題目名稱 最優合併問題 問題描述 給定k 個排好序的序列,用 2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m n 1 次比較。試設 計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需要確定合...
演算法第四章上機實驗報告
題目 最優合併問題 1.問題描述 給定k 個排好序的序列,用 2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m n 1 次比較。試設 計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需要確定合併這...
演算法第四章上機實驗報告
4 1 程式儲存問題 40 分 設有n 個程式要存放在長度為l的磁帶上。程式i存放在磁帶上的長度是 li,1 i n。程式儲存問題要求確定這n 個程式在磁帶上的乙個儲存方案,使得能夠在磁帶上儲存盡可能多的程式。對於給定的n個程式存放在磁帶上的長度,計算磁帶上最多可以儲存的程式數。第一行是2 個正整數...