寻找最大数(三)
第一部分:题目
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1057
描述
给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。
求这个新的整数的最大值是多少。
- 输入
- 多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100). - 输出
- 每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
- 样例输入
-
1990 1 100 0 9090000078001234 6
- 样例输出
-
9190 100 9907000008001234
第二部分:思路
要点:每次从头开始,以一个位置为起点,在可移动步数内找一个最大值,然后移动到起点 ,可移动步数减去当前移动步数。如果还可移动在从头开始找。
注意:所给移动步数不一定用完,退出的两个原因:1,可移动次数用完。2,无法通过移动使数值变大。具体看代码注释
第三部分:解题出现的错误
1,一开始想错了,以为只要一个数比它相邻后一位小就交换。
2,思路转变后,在进行移动时一开始就把最大值赋给了起点,然后就找错找半天。
第四部分:ac代码
#include<stdio.h> #include<string.h> int main() { int len,i,n,t; char s[20]; while(scanf("%s %d",&s,&n)!=EOF) { len=strlen(s); while(n)//n>0表示还可以进行移动,但是如果移动不会使结果变大就可以结束了 { //每次都从头开始寻找移动的位置:从当前位置往后找最大的数, //注意:所寻找的数的位置必须在范围之内:位置差小于等于可移动步数 for(i=0;i<len;i++) { int j; char max=s[i]; int index=i; for(j=i+1;j<len;j++) { if(n<j-i)//位置差在可移动步数内,找最大值 { break; } if(max<s[j]) { index=j; max=s[j]; } } if(index>i)//说明找到'有效最大数'。把数移到i位置处,前面数后移 { int l; int temp=s[index];//这里需要注意,必须用一个变量暂时存放有效最大值 for(l=index;l>i;l--) { s[l]=s[l-1]; } s[l]=temp; n-=(index-i);//剩余可移动次数 break; } } if(i==len)//表示无法进行移动使数值变大 { break; } } for(i=0;i<len;i++) { printf("%c",s[i]); } printf("\n"); } return 0; }
害怕失败的人,已经是一个loser!