• NOYJ——寻找最大数


    1)题目:寻找最大数

        请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,比如当n=92081346718538,m=10时,则新的最大数是9888输入第一行输入一个正整数T,表示有T组测试数据

      输入

       每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数)

      输出

       每组测试数据的输出占一行,输出剩余的数字按原次序组成的最大新数

      样例输入

        2
        92081346718538 10
        1008908 5

      样例输出

        9888 98

    2)算法分析:

       题目中明确的指出了要删除一部分数,使得剩下的数最大,那么我们同样可以将思路反转,我们来选取最大的数,使之构成s最大的数。就像样例中m=10;我们就可以选取strlen(s)-m个数字来构成我们所需要的数。首先我们将数字以字符串的形式来存储。其次,我们需要选择最高位的数字,但是题目中的要求是在原数上删除,所以我们不可以打乱原数字各个位的顺序,所以第一个数字我们只能从s[0]到s[m]中查找最大数,然后从最大数字之后的一位到s[m+1]中查找第二位,直至找到最后一位。在这个过程中我们必须要保证还有足够的数字来供我们选择,因为不管什么,数位多的肯定要比数位少的大。

    3)源代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;

    int main()
    {
    int ncase;
    char s[110], ans[110];
    int m, len, sign, max, num;
    scanf("%d", &ncase);
    while(ncase--)
    {
    num = sign = 0;
    scanf("%s%d", s, &m);
    len = strlen(s);
    for(int i = 0; i < len - m; ++i) //找m次最大值
    {
    max = -1;
    for(int j = sign; j <= m + i; ++j) //j的范围不能错~保证位数
    {
    if(max < s[j] - '0')
    {
    max = s[j] - '0';
    sign = j;
    }
    }
    ans[num++] = s[sign++];
    }
    for(int i = 0; i < len - m; ++i)
    cout<<ans[i] - '0';
    cout<<endl;
    }
    return 0;
    }

     

  • 相关阅读:
    SQL------Hint
    JVM——垃圾回收
    JVM——内存结构
    SpringMVC——拦截器,过滤器实现登录拦截
    SpringMVC——参数传递
    SpringMVC——数据乱码问题
    SpringMVC——MVC执行流程底层剖析
    Spring——5种增强方式
    Spring——bean的五种作用域和生命周期
    Spring——多种方式实现依赖注入
  • 原文地址:https://www.cnblogs.com/weiliuyby/p/5893448.html
Copyright © 2020-2023  润新知