贪心算法删数问题



删数问题

给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n和k,设计一个算法,找出剩下数字组成的新数最少的删数方案。
输入示例: 178543 4
输出: 13
输入示例: 56317 3
输出: 17

分析:

每一步总是选择一个使剩下的数最小的数字删除。
即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字符。
删除之后,其他数字往前移动一位,填补位置。
最后把剩下的几个数字,组成一个整数。

#include<stdio.h>
#include<math.h> 

int main()
{
    int a,n,k;          //n指a有多少位 
    int i,j,s=1;
    scanf("%d",&a);     //a为输入的整数   
    scanf("%d",&k);     //删去k个数字 
    n=log10(a)+1;       
    
    int p[n];
    j=a;
    for(i=n-1;i>=0;i--){  //数组p中从0到n-1,分别为:5 6 3 1 7 
        p[i]=j%10;
        j/=10;
    }
    
    for(i=1;i<=k;i++){  //控制删去的个数 
        for(j=0;j<n-i;j++){
            if(p[j]<p[j+1]){  //如果递增,删除最后一个数 
                continue;
            }else{            //如果递减,删除第一个数 
                p[j]=-1;
                break;
            }
        } 
        for(j=0;j<n-i;j++){   //删掉的数的位置被赋值-1,现在把-1以后的数 
            if(p[j]==-1){     //都往前挪 
                p[j]=p[j+1];
                p[j+1]=-1;
            }
        }
    }
    
    for(i=0;i<n-k;i++){
        printf("%d",p[i]);
    }
    return 0;
}
运行截图

推荐阅读更多精彩内容

  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 22,979评论 6 94
  • 9.3.3 快速排序   快速排序将原数组划分为两个子数组,第一个子数组中元素小于等于某个边界值,第二个子数组中的...
    StarryThrone阅读 659评论 0 3
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    O感悟人生O阅读 8,205评论 2 28
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    千机楼阅读 917评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 87,548评论 13 122