zoukankan      html  css  js  c++  java
  • 25-删除m位数是剩下的最大

    /*                                    寻找最大数
      题目内容:

    请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,
    比如当n=92081346718538,m=10时,则新的最大数是9888

    输入描述

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


    输出描述

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


    输入样例

    2
    92081346718538 10
    1008908 5


    输出样例

    9888
    98
    */
    //暴力求解,循环搜索m次逆序的将其去掉,通过将其赋为后面大的那个数的相反数,如果有m个逆序,那得到的除去负值就是该
    //求最大数,如果去掉的不足m个,显然前面len - m个非负数就是所求最大数。

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

    int main(){
        char a[105];
        int b[105], c[105];
        int n;
        cin >> n;
        while(n--){
            int m;
            cin >> a;    
            cin >> m;
            int count = 0, len = strlen(a);
            for(int i = 0; i < len; i++)
                b[i] = a[i] - '0';
            for(int j = 0; j < m; j++)
                for(int i = 0; i < len - 1, count <= m; i++){
                    if(b[i] >= 0 && b[i] < abs(b[i + 1])){
                        b[i] = - abs(b[i + 1]);
                        count++;
                        break;
                    }
                }
            int s = 0;
            for(int i = 0; i < len; i++){
                if(b[i] >= 0){
                    c[s++] = b[i];
                }
            }
            int len1 = len - m, cc = 0;
            for(int i = 0; i < s; i++){
                cout << c[i];
                cc++;
                if(cc >= len1)
                    break;
            }
            cout << endl;
        }
        return 0;
    }

    核心思想:比如  92081346718538   这个数,去掉十个数之后,按原来的次序组成最大数,那么开始计算,
    一共14位数,如果去掉十位数,剩四位数,要想这四位数最大,那么逐次查找,使得首位最大才是结果最大
    的前提:一:从前11位开始查找,找到一位最大数,对这个位置做个标记flag;二,从flag到第12位数,找
    到最大值,再做标记flag,依次循环,,,,,,直到找到最后结果为止


    #include<stdio.h>
    #include<string.h>
    #define M 101
    char a[M],b[M];
    int i,j,n,m,flag;
    int main()
    {
        int k;
        scanf("%d",&k);    
        while(k--)
        {
            j=0;flag=0;
            memset(a,0,sizeof(a));
            scanf("%s %d",a,&m);
            n=strlen(a);
            for(int w=m;w<n;w++)
            {
                char max=a[flag];
                for(i=flag;i<=w;i++)
                {
                    if(max<a[i])
                    {
                        max=a[i];
                        flag=i;
                    }
                }
                b[j++]=max;
                a[flag]='0';
            }
            puts(b);
        }
        return 0;
    }

  • 相关阅读:
    php发送post请求的方法
    跨域请求的三种解决办法
    php验证码+js点击刷新
    13.mysql数据类型
    12.dateformat常用格式
    11.设计的三大范式
    nginx passwd (http://www.voidcn.com/article/p-suebfyqy-nx.html)
    删除文件 过滤某个文件
    mac必装软件
    elasticsearch 安装
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7429802.html
Copyright © 2011-2022 走看看