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

输入一个高精度正整数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的长度是len。
  5 void outPut(char *a,int len);//输出删除后的数组
  6 int main()
  7 {
  8     char a[300];
  9     int len,s;
 10     int res;
 11     freopen("5.in","r",stdin);
 12     scanf("%s",a);
 13     scanf("%d",&s);
 14     //printf("这个是辅助信息。数组原来的样子是:");
 15     //puts(a);
 16     len=strlen(a);
 17     res=fun(a,len,s);
 18     if(res==0)/*fun函数返回值正常.*/
 19     {
 20         outPut(a,len);
 21     }
 22     //printf("这个是辅助信息。数组最后的样子是:");
 23     //puts(a);
 24     return 0;
 25 }
 26 int fun(char *a,int len,int s)//对数组a表示的高精度整数删除s位。a的长度是len。
 27 {
 28     int i,j=0,k=1;
 29     for(i=0;i<s;i++)
 30     {
 31         while(!( a[j]>a[k] && a[k]!=‘*‘ ) && k<len)//直到a[j]>a[k]而且a[k]不是‘*‘这个条件不成立。注意: ‘*‘的ASCII码是小于数字0的.
 32         {
 33             //j++;
 34             j=k;
 35             k++;
 36         }
 37         if(k<len)//  也即  a[j]>a[k] && a[k]!=‘*‘  这个条件成立了
 38         {
 39             a[j]=‘*‘;
 40         }
 41         else break;
 42         while(j>=0)//j向左扫描寻找第一个非*数字
 43         {
 44             if(a[j]!=‘*‘) break;
 45             j--;
 46         }
 47         if(j==-1)//假如j扫描到数组开头了都没遇到数字,j要指向k所指向的位置
 48         {
 49             j=k;
 50             k++;
 51         }
 52     }
 53     //下面是当上述操作删除的个数不足S个的时候所进行的操作:从后往前删除够s个数字
 54     if(i<s)
 55     {
 56         j=len-1;
 57         for(;i<s;i++)  // for(;i<=s;i++)
 58         {
 59             while(a[j]==‘*‘&&j>=0)//从数组后面往前扫描寻找第一个数字字符
 60             {
 61                 j--;
 62             }
 63             if(j>=0)
 64             {
 65                 a[j]=‘*‘;
 66             }
 67             else
 68             {
 69                 printf("输入错误!逆序数的对数达不到要删除的数量。同时剩余的位数也不够弥补未删除的位数。有可能是输入的s比较大,输入的高精度正整数n的位数比较少。、");
 70                 return 1;//本函数非正常结束
 71             }
 72         }
 73     }
 74     return 0;//本函数正常结束
 75 }
 76
 77 void outPut(char *a,int len)//输出删除后的数组
 78 {
 79     int i,flag,k;
 80     k=0;
 81     for(i=0;i<len;i++)//输出*号的位置
 82     {
 83         if(a[i]==‘*‘)
 84         {
 85             k++;
 86             printf("%d ",i+1);
 87             if(k%10==0) printf("\n");
 88         }
 89     }
 90     printf("\n");
 91
 92     flag=0;//flag==0表示还没有输出过一个非0的数字字符
 93     for(i=0;i<len;i++)
 94     {
 95         if(a[i]!=‘*‘)//说明a[i]是数字字符
 96         {
 97             if(a[i]!=‘0‘)
 98             {
 99                 printf("%c",a[i]);
100                 flag=1;
101             }
102             else
103             {
104                 if(flag==1) //a[i]是数字字符‘0‘,但是不是最高位的字符0.
105                     printf("%c",a[i]);
106             }
107         }
108     }
109     if(flag==0) printf("0");
110     printf("\n");
111 }

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

时间: 2025-01-01 08:29:59

贪心算法练习:寻找最小数的相关文章

贪婪法——————贪心算法

华信清明节放假,所以不用去上课,而我又不想出去,所以就用了一点时间去研究算法. 我今天开始看王晓华写的<算法的乐趣>,把它当做教材. 看到贪心算法,因为大一的时候C语言没学好,所以作者写的C实现代码不是看得很懂,但是基本思想还是能够掌握的. 接下来我总结一下我今天学到的贪心算法: 贪心算法是寻找最优解问题的常用方法. 基本思想是分三个步骤: 1.建立对问题精确描述的数学模型,包货定义最优解的模型. 2.将问题分成一系列的子问题,同时定义子问题的最优解结构. 3.应用贪心算法原则可以确定每个子问

贪心算法入门

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

NYOJ 1057 寻找最大数(三)(关于贪心算法的认识)

以前做贪心题目都第一步对数据进行从大到小的排序,大部分贪心题目的的处理方法也是这样.但是NYOJ的1057题,在解题中 并不需要排序,一时间都没有意识到是贪心题.在看了讨论区之后意识到要用贪心的思想,才解出题目.认识到贪心算法并非是排序后再处理的机械操作,而是从局部寻求最优解的思想. 原题如下: 寻找最大数(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的最大值

十一:贪心算法-寻找硬币

问题:贪心算法-寻找硬币题目描述现有价值分别为:1 3 5 10的硬币若干.请用最少的硬币数量找出n(n<100000000)元钱.输入一个数字,表示要找出的钱的数量输出一个数字,表示需要多少硬币样例输入14样例输出 3 1 #include<stdio.h> 2 #include<stdlib.h> 3 long k=100000000; 4 int a[4]={1,3,5,10}; 5 void fun(int n,int m,int sum){ 6 int i; 7 i

贪心算法的简述与示例

贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯.能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质. 参考:http://babybandf.blog.163.com/blog/static/61993532010112923767/ [例1]删数问题[B][/B] 试题描

贪心算法

一,贪心算法的设计思想 ? 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止. 二,贪心算法的基本性质 1)贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.这是贪心算法可行的第一个基本要素,也是贪心法与动态规划法的主要区别. 2) 最优子结构性质 该问题解的整体最优性依赖于其局部子问题解的最优性.这种性质是可以采用贪心算法解决问题的关键特征.例如

贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal&amp;#39;s algorithm)

克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikipedia上的那个.很清晰且直观. 首先第一步,我们有一张图,有若干点和边 例如以下图所看到的: 第一步我们要做的事情就是将全部的边的长度排序,用排序的结果作为我们选择边的根据.这里再次体现了贪心算法的思想.资源排序,对局部最优的资源进行选择. 排序完毕后,我们领先选择了边AD. 这样我们的图就变成了 第

【算法导论】贪心算法之活动选择问题

动态规划总是在追求全局最优的解,但是有时候,这样有点费时.贪心算法,在求解过程中,并不追求全局最优解,而是追求每一步的最优,所以贪心算法也不保证一定能够获得全局最优解,但是贪心算法在很多问题却额可以求得最优解. 一.问题概述 活动选择问题: 假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用.每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<正无穷.如

分治法、动态规划、回溯法、分支界限法、贪心算法

转:http://blog.csdn.net/lcj_cjfykx/article/details/41691787 分治算法一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时