标签:
问题描述:用键盘输入一个高精度的正整数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 }
贪心选择性质:可通过局部最优选择来达到全局最优解。
标签:
原文地址:http://www.cnblogs.com/xiaoying1245970347/p/4630399.html