删数问题(贪心法经典问题)

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

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

时间: 2024-08-04 05:35:33

删数问题(贪心法经典问题)的相关文章

删数问题--贪心

删数问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定n 位(n≤100)正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数.对于给定的n 位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案. 对于给定的正整数a,计算删去k 个数字后得到的最小数. 输入 输入数据的第1 行是1 个正整数a.第2 行是正整数k. 输出 将计算出的最小数输出. 示例输入 178543 4

【贪心】删数问题

[贪心]删数问题 题目描述 输入一个高精度的正整数n(≤240位),去掉其中任意s个数字后,剩下的数字按原左右次序组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小. 输入 第1行:一个正整数n: 第2行:s(s<n的位数). 输出 最后剩下的最小数. 样例输入 175438 4 样例输出 13分析:结论是删去第一个递减的数,如果没有则删去最后一个数:代码: #include <iostream> #include <cstdio> #incl

删数问题

删数问题 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 72   Accepted Submission(s) : 16 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 键盘输入一个高精度的正整数n(≤240位),去掉其中任意s个数字

codevs4096 删数问题

题目描述 Description 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N 和S,寻找一种方案使得剩下的数字组成的新数最小. 输入数据均不需要判错. 输出组成的新的正整数.(N不超过240位) 输入描述 Input Description 第一行,输入一正整数N(N<=10240),表示要删的数: 第二行,输入一正整数S,表示删去的个数,当然S小于N的位数. 输出描述 Output Description 仅一行,输出删数后形

洛谷P1106 删数问题

题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数字的位置和组成的新的整数.(N不超过250位) 输入数据均不需判错. 输入输出格式 输入格式: n (高精度的正整数) k (需要删除的数字个数) 输出格式: 最后剩下的最小数. 输入输出样例 输入样例#1: 175438 4 输出样例#1: 13分析:贪心思想,我们每次删数肯定是要找前面的大数给删掉,并且这

4906 删数问题

4906 删数问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N 和S,寻找一种方案使得剩下的数字组成的新数最小. 输入数据均不需要判错. 输出组成的新的正整数.(N不超过240位) 输入描述 Input Description 第一行,输入一正整数N(N<=10240),表示要删的数: 第二行,

1106 删数问题

1106 删数问题 难度:普及/提高- 题目类型:贪心 提交次数:3 涉及知识:字符串.贪心 题目描述 键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小. 输出应包括所去掉的数字的位置和组成的新的正整数.(N不超过250位) 输入数据均不需判错. 代码: #include<iostream> #include<cstring> using namespace std; int

【算法学习笔记】25.贪心法 均分纸牌问题的分析

贪心法: 贪?算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是贪?心策略的选择,选择的贪?策略必须具备?后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 太概念化了.总结起来三点: 可行性:必须满足问题的约束 局部最优:当前步骤中所有可行的选择里最佳的局部选择. 不可取消:选择一旦做出,后面的步骤就无法改变. 问题要具有贪心选择性

算法课作业之删数问题

问题描述: 通过键盘输入一个高精度的正整数n(n的有效位数≤240),去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小. 问题分析: 这个问题是最优子结构问题,即局部最优能决定全局最优解,可以使用贪心算法进行解决.n个正整数去掉s个数字,求使得到的新的正整数最大的删除方案可以等价为:对于n个正整数组成的数字,一个一个地依次去掉s个数字,要求每删除一个数时,都使删除后的新的正整数最小.因此问题转化为求解删除一个数字时