• 寻找最大数(三)


    第一部分:题目

    题目链接: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("
    ");
        }
        return 0;
    }
  • 相关阅读:
    (双指针 二分) leetcode 167. Two Sum II
    (双指针) leetcode 485. Max Consecutive Ones
    (双指针) leetcode 27. Remove Element
    (String) leetcode 67. Add Binary
    (数组) leetcode 66. Plus One
    (N叉树 BFS) leetcode429. N-ary Tree Level Order Traversal
    (N叉树 递归) leetcode 590. N-ary Tree Postorder Traversal
    (N叉树 递归) leetcode589. N-ary Tree Preorder Traversal
    (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree
    (BST 递归) leetcode98. Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5418934.html
Copyright © 2020-2023  润新知