zoukankan      html  css  js  c++  java
  • 删数问题(贪心法经典问题)

    问题描述:用键盘输入一个高精度的正整数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 }

    贪心选择性质:可通过局部最优选择来达到全局最优解。

  • 相关阅读:
    Linux环境下安装python3
    软件测试类型
    系统测试分类
    测试级别
    测试对象的介绍
    软件测试基本介绍
    简易留言板(还有一些小bug,修复ing...)
    Hosting static website on AWS
    Add a dependency in Android Studio
    Python good tutorials
  • 原文地址:https://www.cnblogs.com/xiaoying1245970347/p/4630399.html
Copyright © 2011-2022 走看看