寻找最大数(三)
时间限制: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
-
-
**不得不说,一道简单题却花了N长时间,哎,差距还是在那摆着啊,总结:题上让你一步一步交换,你就别打小聪明一次解决,不然wa到你哭!!
-
先说说讨论区吧,我看好多人都直接两两一交换。。这样实在是太天真了,你以为2分的题就可以随便水吗(当然可能是我水平太菜,不过你水平高也不会看到这个的,大家就不要互相伤害了),简单的eg:12345 3交换三次,最大结果应该是41235 ,二不是什么23415 324125 的
-
思路:贪心算法,找一定区间的最大值(这个区间就是从当前位置后面一位!! i+1 开始到i+1+k ),然后交换x次,这个x次就是用maxpos(最大数位置)-i就好了
-
-
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> char s[1010]; int main() { int k; while(~scanf("%s%d",&s,&k)) { int i,j,maxpos;//记录最大位置 bool isfind;//是否找到了 char max;//每次的比较对象 for(i=0;i<strlen(s)-1 && k ;i++) { max = s[i];//每次找之前初始化一下 maxpos = i; isfind = false; for(j=i+1;j<i+1+k && j<strlen(s);j++)//注意这里面的判断条件就好!一定要想一想 { if(s[j]>max) { max=s[j];//改变一下比较对象 maxpos = j; isfind = true; } } if(isfind)//如果找到了就开始交换 { for(int q=maxpos;q>i;q--)//!!!这里一定要注意一步一步的交换,如果一步到位,后果很严重,简单的说就是如果你不一步一步换位的话会影响到后面的判断!! { char temp=s[q]; s[q]=s[q-1]; s[q-1]=temp; } k = k-maxpos+i; } } printf("%s\n",s);//输出结果,去AC把骚年!! } return 0; }
奈何我冒泡的算法如何打动你超时的心!!
- 多组测试数据。