NYOJ1057寻找最大数(三)

来源:互联网 发布:linux显示包含隐藏文件 编辑:程序博客网 时间:2024/05/16 18:21

寻找最大数(三)

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

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

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

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

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;}


奈何我冒泡的算法如何打动你超时的心!!

0 0
原创粉丝点击