输入一个高精度的正整数n,去掉其中任意s个数字后,剩下的数字按原左右次序组成一个新的正整数。编程对于给定的n和s,寻找其中一种方案使得剩下的数字组成的新数最小。
输出新的正整数。(n不超过240位)
输入数据均不需要判错。
【输入格式】
n
s
【输出格式】
最后剩下的最小数。
【输入样例】
175438
4
【输出样例】
13
代码:
#include<cstring>
#include<iostream>
using namespace std;
int a[101],num=0,len,del;
void change(int,int);
int main(){
int i;
char n[101];
cin>>n>>del;
len=strlen(n);
for(i=0;i<len;i++){
a[i]=n[i]-'0';
}
//for(i=0;i<len;i++){
// cout<<a[i];
//}
int min=a[0];
for(i=0;i<len;i++){
if(a[i]<min)
min=a[i];
}
change(del,0);
return 0;
}
void change(int n,int s){//m代表字符串长度,n代表要去掉的数目,s从此处开始搜索
num++;
int m=s,min=a[s];//注意m是等于s
for(int i=s;i<=s+n;i++){
if(min>a[i]){
min=a[i];
m=i;
}
}
//cout<<m<<endl;
cout<<min;
if(num!=(len-del))
change(n-m,m+1);
else
return ;
}
/*
175438
4
7654321
4
*/
1、这是我自己用递归的方法做的,与《信息学奥赛》这本书给出的方法不大一样,那本书中,采用的是贪心算法。
2、递归的思路是:
(1)、既然是原次序不变,那么我们要做的,是从原数的前s+1数中找到最小的一个数,并“记住”这个最小数所在的位置m。
(2)、那么,前m个数我们已经用不到了,可以视为已经删除。接下来,我们要从第m+1个数出发,继续寻找最小数。
(3)、这时候,已经有m个数已经删除,所以,我们需要从剩下的字符串里面,查找前(n-m+1)个数的最小数。n代表我们想要删除的总数。
(4)、循环递归
注意事项:
int m=s,min=a[s];//注意m是等于s
for(int i=s;i<=s+n;i++){
if(min>a[i]){
min=a[i];
m=i;
}
}
这里面,m是等于s,不是等于0;因为要检索的第一个数是最小数的话,就不经过下面的if判断,就会一直等于0而产生错误。这里面,我们将参数s设置为要检索的第一个数下标。