问题描述:给定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] = s[j+1] ;
}
}
}
s[i] = '\0' ;
}
int FindMaxNumber(char s[])
{
int i ;
for(i=0; s[i]!='\0'; i++){
}
return i-1 ;
}
void DeleNumber(char s[], int k){ //删除一个数
int i ;
for(i=0; s[i+1]!='\0' && k>0; i++)

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

被折叠的 条评论
为什么被折叠?



