zoukankan      html  css  js  c++  java
  • 寻找最大数(三)

    第一部分:题目

    题目链接: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;
    }
  • 相关阅读:
    设计模式---策略模式
    maven+eclipse创建web项目
    【Mybatis】多对多实例
    【Mybatis】一对多实例
    【Mybatis】一对一实例
    S5PV210的开发与学习:2.6 UBOOT学习笔记(uboot源码分析3-uboot如何启动内核)
    S5PV210的开发与学习:2.5 UBOOT学习笔记(uboot源码分析2-启动第二阶段)
    S5PV210的开发与学习:2.4 UBOOT学习笔记(uboot源码分析1-启动第一阶段)
    uboot 移植文件差异比较报告
    S5PV210的开发与学习:2.3 UBOOT学习笔记(uboot配置和编译过程详解)
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5418934.html
Copyright © 2011-2022 走看看