南阳理工训练题《寻找最大数(三)》

题解:在这个题目当中,需要注意的是,相邻的数字要移动,博主在做的过程中就忽视了这点,就导致有个数据出错,如果不是在南阳理工的讨论区发现了测评数据,在输入的过程中发现了结果不一致,才明白到问题出现在哪。

测评数据1695679945   4,正确答案为9651679945,而博主的原本答案则为9665179945.问题就出现在博主在程序中,1与9是直接对换就导致了6的位置根本就没有变化,所以就导致了出错。

再回到题目当中,要求新的整数是最大的,意思就是在可移动的范围内,把范围内最大的数字提到前面来,改变范围取值以及范围大小,最后得到答案。


题目:

寻找最大数(三)

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。

求这个新的整数的最大值是多少。

输入
多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
输出
每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
样例输入
1990 1
100 0
9090000078001234 6
样例输出
9190
100
9907000008001234
来源
原创



原创代码:

#include<stdio.h>
#include<string.h>
char a[500];
int k;
void f()
{
	int n=strlen(a),t,i,j,l;
	char c='0';
	for(i=0;i<n;i++)
	{
		c=a[i];
		t=-1;
		for(j=i+1;j<=k+i;j++)
		{
			if(c<a[j])
			{
				c=a[j];
				t=j;	
			}
		}
		if(t!=-1)
		{
			for(l=t;l>i;l--)
			{ 
				c=a[l];
				a[l]=a[l-1];
				a[l-1]=c;
			}
			k=k-(t-i);
		}
		if(k==0)
			break;
	}
	for(i=0;i<n;i++)
		printf("%c",a[i]); 
	printf("\n");
}
int main()
{
	int n,i;
	memset(a,0,sizeof(a));
	while(scanf("%s%d",a,&k)!=EOF)
	{
		f();
		memset(a,0,sizeof(a));	
	}
} 


测评数据:

332 55
7908376 81
26412 78
7803299 17
1055669685993329 93
1695679945 4
244433 54
87246471881 22
586722803 73
5934693612 54
577045287 69
402047808436 49
7710972916361 96
1441930458533879 86
9278750186997489 62
4152830322935739 96
2803661015451 69
42062923624 22
9463775138 45
415486594857383283 51
889706517279 19
1090147241 34
678641 12
9303178346 11
697115604467939 92
1707 28
10448590692 89
2082513 33
31218337287390984 92
7950947886 36
18134219311867682 35
3121 22
862082035928152425 62
62905565804437 18
69181438015349 86
92932344922189532 39
774802576052608 98
798626633856 78
17099586320 100
13089718225313 88
50358932560297 42
668074941972 34
476188628924250 29
90686297914 54
10550 87
6983865 60
1253460 50
37320 7
79307140391735 42
685562691855151 11
7081826251 97
208511587832 89
6002535353 63
46704582532597668 95
868026756694756761 7
36460279294 48
3787919417378 45
541343 51
8845076 45
899 74
44824256769504557 16
8476615 17
6089536743883 37
9450 32
299206579985798 15
4493 39
710733 35
38 20
1058919329733848758 27
893699 90
143276 56
104954098377032050 73
81332 54
1268 14
672901 85
70563227634 52
4518688270037998 5
91373792774 85
5408861 84
9194561 32
3071161571 34
21382915589 53
718646619 25
913619909696679541 16
81672 64
10042703698551 49
21301 55
1878156341854856 6
3969 49
709327475802 59
3753781 11
437036 52
764835339699678983 98
25147884 30
1111586949668051 36
271103729403 36
825511 5
79748468235300 41
55998613859220091 8
195300690839678 42

/*输出结果*/
332
9877630
64221
9987320
9999866655533210
9651679945
444332
88877644211
887653220
9966543321
877755420
887644432000
9977766321110
9988755444333110
9999888777654201
9987554333322210
8665543211100
96644222032
9877654331
988887544165453323
998877651027
9744211100
876641
9873310346
999776665443110
7710
99865442100
8532210
99888774333322110
9988776540
98884312113116762
3211
988865554322221002
98665525004437
99886544331110
99998542323422132
887776655422000
988766665332
99876532100
98875333221110
99876553320502
998776644210
988876642214250
99987664210
55100
9886653
6543210
73320
99777543331100
986655621855151
8876522110
888755322110
6555333200
98877666555443220
887660256694756761
99766443220
9988777743311
544331
8876540
998
98454242676504557
8766541
9888766543330
9540
999922605785798
9443
773310
83
9998751013233848758
999863
764321
998775544332100000
83321
8621
976210
77665433220
8546188270037998
99777743321
8865410
9965411
7765311110
99885532211
987666411
999963110696679541
87621
98765541200031
32110
8875116341854856
9963
987775432200
8775331
764330
999988877666543333
88754421
9988611511466051
977433221100
855211
98877654433200
99865513859220091
999887153006036

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值