贪心算法——删数问题(修改后)

2023-12-28 14:38

本文主要是介绍贪心算法——删数问题(修改后),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

要求:一个m位的数,去掉其中任意s个数,剩下的数按原次序组成一个新的数,要求编写程序是的重新组合的那个数最小。

主要思路:
1、确定最高位:现在前s+1个数中找到最小的那个数,同时将所找到的这个数之前的数全部删掉。(因为删除s个数,所以最高位的那个数肯定在前s+1之中)
2、按同样的方法依次确定第i位数,但是数字比较的范围要缩小到从上一个确定的数后一位数到第s+i位数。(一共比较s次)
3、在删数的过程中要判断当前是否已经删满s个数了。
4、若s次比较完之后删除的数不满s个(假如只删了n个),那就要将最后s-n个数删除。

C++代码:
修改后的代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
using  namespace std;void deletea(char *num,int j,int n){for(int i=j;i<strlen(num)-n;i=i+n){num[i]=num[i+n];}
}int length(char *num){return strlen(num);
}void fun(char *num,int k,int *pos){int i=0,j=0,jl=-1;while(i<k&&j<length(num)){while(num[j]<=num[j+1])j++;if(j<length(num)){deletea(num,j,1);if(j>jl)pos[i]=j+i;   //加i是因为前面删除的时候位置会改变elsepos[i]=pos[i-1]-1;   //删除i之后比较i-1和i+1的时候i-1比i+1大的情况i++;jl=j;j=j-1;          //比较i-1和i+1}}if(i!=k){                //比较完之后删除的数字不满k个的情况,那就从最后将少的那几个数删掉for(int m=i;m<=k;m++){deletea(num,length(num)-m,1);pos[i]=length(num)-m;i++;}}
}int main(){char *num;int *pos;   //pos存放删除的数的位置int k;cin>>k;pos=new int[k+1];num=new char[100];fflush(stdin);cin>>num;int len=length(num);fun(num,k,pos);for(int i=0;i<len-k;i++)cout<<num[i];cout<<endl;for(int i=0;i<k;i++)cout<<pos[i];cout<<endl;return 0;
}

修改前错误代码:

#include <iostream>
using namespace std;
void fun(char a[],int m,int s)
{int i,j,dcount=0,pos,key=0;char mini;for(i=0;i<s;i++){if(dcount==s)           //判断当前是否已经删除完成break;mini='z';for(j=key;j<=s+i;j++)   //从最高位开始确定{if(a[j]<mini){mini=a[j];pos=j;}}for(j=key;j<pos;j++){a[j]='*';dcount++;}key=pos+1;             //确定下一个位数开始的位置}if(dcount!=s)              //删除最后几位的情况{for(i=m-1;i>=m-s+dcount;i--)a[i]='*';dcount=s;}
}
int main()
{char *a;int m,s,i;cout<<"请输入原数据长度以及删除位数:"<<endl;cin>>m>>s;a=new char[m];cout<<"请输入数据:"<<endl;cin>>a;fun(a,m,s);for(i=0;i<m;i++)if(a[i]!='*')cout<<a[i];return 0;
}

运行结果实例:(运行环境:CodeBlocks)
这里写图片描述

这篇关于贪心算法——删数问题(修改后)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/546285

相关文章

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.