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

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

相关文章

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1