寻找最大数(三)

第一部分:题目

题目链接: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;
}

 

posted @ 2016-04-21 21:47  喝醉的香锅锅  阅读(374)  评论(0编辑  收藏  举报