2017.12.27 算法分析 贪心算法删除数字求最小值问题

1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b;

一.我的想法:先看例子:a=5476579228;去掉4位,则位数n=10,k=4,要求的最小数字b是n-k=6位的;

1、先找最高位的数,因为是6位数字,所以最高位不可能在后5位上取到(因为数字的相对顺序是不能改变的,假设如果取了后五位中倒数第5位的7,则所求的b就不可能是6位的了,最多也就是4位的79228)理解这点很重要!所以问题变成从第1位到第k+1(n-(n-k-1))取最小值,为什么是k+1,可以自己想一下。在这里就变成了

/54765/79228在斜杠中间选择最小的数字!

2、这样根据序号1,取得最小值4,那么最高位就已经确定了是4;然后6位的数就变为还有5位要确定,同上边的推理过程,次高位不可能取后4位中的任何数字,因为第一位确定了是第二位上的4,所以4之前的数字也不可能取到了(因为所求数字的相对顺序不能发生变化),所以变为求54/7657/9228中,斜杠之内的数字的最小值,得到是5。3、然后取第三位数字54765/79/228,第三位取7;547657/92/28第四位取2;54765792/2/8,第五位只能是2;第六位就是8;则所得数字就是457228;

4、继续想一个问题如果输入的整数a是3346579228,同样n=10,k=4;会遇到什么样的问题呢?同上边的过程第一步:/33465/79228,此时区间内有两个相同的最小值3,该用哪个值呢?很明显应该选取第一个3,why?因为试想如果取第二个则,第二次就只能在4657中选择最小值,而取第一个3,则可以再34657中取得3。

5、这个算法思路大概就是这样的,算法具体该怎么实现呢?首先我们要知道程序体要循环n-k次,因为只有这样我们才能每次循环取出最小的数字;其次就是怎么取区间内的最小值。我这里用的是通过循环遍历整个区间取得最小值,最关键的是确定区间的起始位置,第一次循环的位置最好确定就是1,结束位置就是k+1,第二次循环的起始位置是第一次取出的最小值的坐标值加1,结束位置是k+2;然后继续记录最小值的坐标值,以计算下一次的起始位置。

6、这是我的代码:

#include<iostream>
using namespace std;
int main(){
    int num,k,n=0,a[100],x;
 cin>>num>>k;
 x=num;

//计算length(a);
 while(x>0){
  x=x/10;
  n++;
 }
 a[0]=0;

//将输入的整形数字,存入定义的数组中;
 for(int i=n;i>0;i--)
 {
  int s=num%10;
  a[i]=s;
  num=num/10;
 }
 int j,p=0,minn[n-k+1],min,q;
 minn[0]=0;
 for(int i=1;i<=n-k;i++)//n-k次循环;
 {
  min=a[p+1];

//定义q记录坐标;min[]记录每次所取的最小值
  q=p+1;
     for(j=p+1;j<=k+i;j++){
         if(a[j]<min)
      {
          min=a[j];
          q=j;
         }
     }
     p=q;
     minn[i]=min;
    }
    for(int i=1;i<=n-k;i++){
     cout<<minn[i];
 }
    return 0;
}

原文地址:https://www.cnblogs.com/qichunlin/p/8127755.html

时间: 2024-10-08 18:51:46

2017.12.27 算法分析 贪心算法删除数字求最小值问题的相关文章

2017/12/27

1.多态分为运行时多态和编译时多态,前者指父类的引用指向子类的对象,后者通过方法的重载:2.final修饰的方法不能被重写,修饰的类不能被继承:3.内部类可以调用外部类的成员,且只能被外部类调用:4.异常的三种方式,在方法上Throws抛出,try catch, 手动Throw;5.java的本质是数据核对数据的操作:6.获取构造器.方法和成员变量时,如果目标为private修饰,要先修改权限: 7. Class cls=Cat.class;@1 Object o=cls.newInstance

删除K个数字后的最小值(贪心算法实现)

给出一个整数,从该整数中去掉k个数字,要求剩下的数字形成的新整数尽可能小.应该如何选取被去掉的数字? 其中,整数的长度大于或等于k,给出的整数的大小可以超过long类型的数字范围. 思路: 把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右面的数字,那么在删除该数字之后,必然会使该数位的值降低.这种求局部最优解,最终得到全局最优解的思想,叫作“贪心算法”. 如果要删除k个数字,那么将遍历数字作为外层循环,以k作为外层循环,再结合栈的使用.将遍历的数字逐个入栈,遇到入栈进来的数字小于栈

算法导论----贪心算法,删除k个数,使剩下的数字最小

先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4,要求的最小数字b是n-k=6位的: 1.先找最高位的数,因为是6位数字,所以最高位不可能在后5位上取到(因为数字的相对顺序是不能改变的,假设如果取了后五位中倒数第5位的7,则所求的b就不可能是6位的了,最多也就是4位的79228)理解这点很重要!所以问题变成从第1位到第k+1(n-(n-k-1))取

算法学习——贪心算法之删数字(求最大值)

算法描述 在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最大值(原次序不变) 算法思路 考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素 使用贪心算法,每一步都要达到最优 从最高位开始,若是下一位比上一位大,则比上一位的数字移出,结束之后再次从最高位开始 例如 16489657 删除4个数字 首先比较1和6 删除1 得到 6489657 之后,再次比较 6和4 往后推 可得到 689657 以此类推 删除4个数字之后 可得到 96

算法学习——贪心算法之删数字(求最小值)

算法描述 在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最小值(原次序不变) 算法思路 考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素 使用贪心算法,每一步都要达到最优 从最高位开始,若下一位比上一位要小,则将上一位的数字移出,结束之后再次从最高位开始 这里需要注意,会有特例 当输入从小到大的的一个数的时候,上述算法将会无法运行,比如123456,删除1个数字变为最小,我们把6删去,这样才是最小的(即从末尾删除数字) 算法实现

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完

贪心算法练习:寻找最小数

输入一个高精度正整数n,去掉其中任意s个数字以后,剩下的数字按原来的左右次序将组成一个新的正整数.编程对给定的n和s,寻找一种方案使得所剩下的数字组成的新数最小. 输出应该包括所去掉的数字的位置和组成的新的正整数.其中,n不超过240位. 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int fun(char *a,int len,int s);//对数组a表示的高精度整数删除s位.a的长

贪心算法入门

今天看了一下贪心算法,贪心算法没有具体的算法框架.贪心算法主要找当前看来最好的解,没有考虑整体最优.得到的只是局部最优解. 贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 二.贪心算法的基本思路: 1.建立数学模型来描述问题. 2.把求解的问题分成若干个子问题. 3.对每一子问题求解,得到子问题的局部最优解. 4.把子问题的解局部最优解合成原来解问题的一

贪心算法基本思想和典型例题(转)

贪心算法 一.算法思想 贪心法的基本思路:——从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解.当达到某算法中的某一步不能再继续前进时,算法停止.该算法存在问题:1. 不能保证求得的最后解是最佳的:2. 不能用来求最大或最小解问题:3. 只能求满足某些约束条件的可行解的范围. 实现该算法的过程:从问题的某一初始解出发:while 能朝给定总目标前进一步 do 求出可行解的一个解元素:由所有解元素组合成问题的一个可行解: 二.例题分析 1.[背包问题]有一个背包,背包容量是M