信息学奥赛

输入一个高精度的正整数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设置为要检索的第一个数下标。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值