演算法第四章實踐報告

2022-09-10 02:48:15 字數 1534 閱讀 5134

1.1問題描述--刪數問題

給定n位正整數a,去掉其中任意k≤n 個數字後,剩下的數字按原次序排列組成乙個新的正整數。對於給定的n位正整數a和正整數 k,設計乙個演算法找出剩下數字組成的新數最小的刪數方案。如果數字最前面有0不輸出。

輸入格式:

第 1 行是1 個正整數 a。第 2 行是正整數k。

輸出格式:

輸出最小數。

1.2演算法描述

1.2.1貪心演算法:

首先得到區域性的最優解,從而推導出全域性的最優解。

1.2.2本題解析:

題目要求在給出的正整數中剔除最大的k位,輸出剩下的位數,且最前面的0不輸出。在刪除數字中,每一步刪除操作是乙個區域性問題,每一步總是選擇乙個使剩下的數最小的數字刪去,按高位到低位的順序搜尋。因此我們可以將其排列,每次只需要刪除公升序序列的尾部或者降序序列的頭部,並且迴圈k次。

第一步,178543中取出乙個數字,應該選取8;

第二步,17543中取出乙個數字,應該選取7;

第三步,1543中取出乙個數字,應該選取5

在第一步刪除數時,從左到右可以找到乙個部分公升序:178

從右到左也可以找到乙個部分降序:8543

因此,8恰好是公升序的最後以及降序的開頭。

在第二步刪除數時,從左到右可以找到乙個部分公升序:17

從右到左也可以找到乙個部分降序:7543

因此,7恰好是公升序的最後以及降序的開頭。

我們的貪心策略就是尋找最大數問題,並剔除其所在的位置,找到第乙個公升序數列的同時取出其末尾。遞迴k次合併成原問題。

1.2.3 偽**

定義自變數:char a[300]; int k、len;

遞迴取數:while k!=0 do {                     //預防不刪數的特殊情況

while n[i]<=n[i+1] do i++          //保證公升序

while ilen--;k--    //保證取出完畢後,長度減小,需要迴圈次數減少

i++1.2.4 複雜度分析

時間複雜度:n

空間複雜度:n

1.3心得體會(對本次實踐收穫及疑惑進行總結)

通過本題,我對char型別陣列有了更深入的理解。當我接觸到本題時,第乙個反應是運用數**算&&設立flag輔助列表記錄數字所在位數——個十百千等,但在實現中處處碰壁,總是報錯。於是通過觀察,轉換思路,使用char型別&&公升序找末尾的方法,但在處理輸出時再次碰壁。因為輸出是不能有0,只有100而沒用0100,所以輸出需要用if判斷,給0作「分流」。貪心演算法其實和人類心裡很符合,總是尋求價效比最高,找最大,找最小。

演算法第四章實踐報告

1.實踐題目名稱 4 1 程式儲存問題 2.問題描述 設有n 個程式要存放在長度為l的磁帶上。程式i存放在磁帶上的長度是 li,1 i n。程式儲存問題要求確定這n 個程式在磁帶上的乙個儲存方案,使得能夠在磁帶上儲存盡可能多的程式。對於給定的n個程式存放在磁帶上的長度,計算磁帶上最多可以儲存的程式數...

演算法第四章實踐報告

刪數問題 給定n位正整數a,去掉其中任意k n 個數字後,剩下的數字按原次序排列組成乙個新的正整數。對於給定的n位正整數a和正整數 k,設計乙個演算法找出剩下數字組成的新數最小的刪數方案。如果數字最前面有0不輸出 貪心演算法的性質 貪心策略 盡量刪除高位的大的數字即尋找單調遞減的第乙個數然後刪除,若...

第四章實踐報告

7 1最優合併問題 1.問題描述 給定k 個排好序的序列,用 2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m n 1 次比較。試設 計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需要確定合併這...