問題描述:用鍵盤輸入一個高精度的正整數N,去掉其中S個數字后剩下的數字按原左右次序排列組成一個新的正整數。
編程給定的N和S,尋找一個方案使得剩下的數字哦組成的新數最小。
思路解析: 使用逼近目標的貪心法來逐一逼近刪除其中s個數符,每一步總數選擇一個是剩下的數最小的數符刪除。這樣的貪心選擇因為刪除S個數符的全優解包含了刪除一個
數符的子問題的最優解。按從左到右尋找遞減區間,刪除第一個數字。若找不到遞減區間 則刪除末尾的數字。
1 void find_Min_Integer(vector<int> &nums,int S) 2 { 3 vector<int> result; 4 5 if(S>nums.size()) 6 { 7 nums.clear(); 8 return; 9 } 10 //從左到右尋找遞歸序列 11 12 while(S>0) 13 { 14 int i; 15 for(i=0;(i<nums.size())&&(nums[i]<=nums[i+1]);i++) 16 ; 17 nums.erase(i); //刪除該區間的首字符 包括找不到遞減區間時 刪除末尾 18 S--; 19 } 20 21 while(nums.size()>1&&nums[0]==0) //刪除頭部的無效數字0 22 nums.erase(0); 23 }
貪心選擇性質:可通過局部最優選擇來達到全局最優解。