(太难了)寻找最大数

119 篇文章 1 订阅

寻找最大数

时间限制: 1000ms
内存限制: 128000KB
64位整型:      Java 类名:
类型: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                   
  • 题目描述

    请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大,

    比如当n=92081346718538,m=10时,则新的最大数是9888

     

    输入

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

    输出

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

    样例输入

    2
    92081346718538 10
    1008908 5
    

    样例输出

    9888
    98
    #include<stdio.h>
    #include<string.h>
    int a[3][109];
    char b[109];
    int main()
    {
        int n;
        scanf("%d",&n);
        getchar();
        while(n--)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            int i,j,sum=0,flag=0,h,k,sunn=1;
            scanf("%s",b);
            scanf("%d",&k);
            int la=strlen(b);
            for(i=0; i<la; i++)
                a[0][i]=b[i]-'0';
            for(i=0; i<la-1&&sum<k&&a[1][i]==0; i++)
            {
                if(a[0][i]<a[0][i+1])
                {
                    flag=1;
                    h=i+1;
                    sunn=0;
                }
                if(flag==1&&sunn==0)
                {
                    for(j=0; j<h&&sum<k; j++)
                    {
                        if(a[0][h]>a[0][j]&&a[1][j]==0)
                        {
                            sum++;
                            a[1][j]=1;
                        }
                    }
                    flag=0;
                }
            }
            if(sunn==0)
            {
                if(sum!=k)
                    for(i=la-1; i>=0; i--)
                        if(a[1][i]==0&&sum<k)
                            a[1][i]=1,sum++;
                for(i=0; i<la; i++)
                    if(a[1][i]==0)
                        printf("%d",a[0][i]);
                printf("\n");
            }
            else
            {
                for(i=0; i<la-k; i++)
                    printf("%d",a[0][i]);
                printf("\n");
            }
        }
        return 0;
    }
    

    优化的方案;
    #include<stdio.h>
    #include<string.h>
    int a[3][109];
    char b[109];
    int main()
    {
        int n;
        scanf("%d",&n);
        getchar();
        while(n--)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            int i,j,sum=0,flag=0,h,k;
            scanf("%s",b);
            scanf("%d",&k);
            int la=strlen(b);
            for(i=0; i<la; i++)
                a[0][i]=b[i]-'0';
            for(i=0; i<la-1&&sum<k; i++)
            {
                if(a[0][i]<a[0][i+1]&&a[1][i]==0)
                    flag=1,h=i+1;
                if(flag)
                {
                    for(j=0; j<h&&sum<k; j++)
                        if(a[0][h]>a[0][j]&&a[1][j]==0)
                            sum++,a[1][j]=1;
                    flag=0;
                }
            }
            int sun=0;
            for(i=0; i<la&&sun<la-k; i++)
                if(a[1][i]==0)
                    printf("%d",a[0][i]),sun++;
                    printf("\n");
        }
        return 0;
    }


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值