删数问题(贪心算法)

本文探讨了一个正整数删数问题,目标是删除n位正整数中k个数,使剩余数字按原顺序排列后形成的正整数最小。通过分析,发现最终生成的新数往往是顺序排列的,因此策略是从第一个数开始,若当前数大于下一个数,则删除当前数,以此得到最小结果。举例说明并提供了自行编写的未优化代码。
摘要由CSDN通过智能技术生成

问题描述:给定n位正整数a,去掉其中任意k<=n个数后,剩下的数按原次序重新排列成一个新的正整数。对于给定的n位正整数a和正整数k,设计一个算法使这个新的正整数达到最小。

问题说明:给定一个正整数a为 785314,经过删数后得到的最小的正整数应该是 14

问题解析:这道题乍一看好象挺简单,我排个序,删4个最大值不就解决了吗?但仔细一看,好像又不太对,上面例子删4个最大值后的值是31,明显比14小很多。这道题难点就在于这个排列问题上,我们进一步观察上面例子,发现最后生成的新数一般是顺序排列的,而比4小的3因为和1逆序排列而被删除,再举一个例子:一个各个位降序排列的正整数如果删数的话一定从第一位删除。进一步总结就是从第一个数开始一个数比后一个数大就删除这个数,最后就可以得到一个最小数。

代码:这个算法是自己写的,没参照网络上的代码,有很多没有优化的地方请见谅啊-_-

#include <stdio.h>

void UpdateS(char s[]){		//更新数组s
	int i, j ;
	
	for(i=0; s[i+1]!='\0'; i++){
		if(s[i] == '#'){
			for(j=i; s[j+1]!='\0'; j++){
				s[j]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值