删数问题

Delete Numbers

 1000(ms)

 65535(kb)

 1561 / 5095

给定n 位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a(n<100) 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。 对于给定的正整数a,编程计算删去k个数字后得到的最小数。

输入

1 行是1 个正整数a。第2 行是正整数k。

输出

计算出的最小数(输出无前导0)

样例输入

178543 4

样例输出

13

因为输入的时候输入的是连串的数字,所以我用的字符串输入,再转换为数组,虽然有点麻烦,但是还是蛮方便的,如果有更好的方法那就更好了

至于删数的方法是,从左边开始删除大于右边的每一个数字,可能有点方,为什么要这样做呢,emm说实在的我也不知道,但是这个规律是没错的

附上代码~

#include<stdio.h>

int a[100][100];

int n,m,k=0;

void pai(int x)

{

    if(k>=n*m)

    {

        return;

    }

    int i,j;

    for(j=x;j<m-x;j++,k++)

    {

        if(k>=n*m)

        {

            break;

        }

        a[x][j]=k%10;

    }

    for(i=x+1;i<n-x;i++,k++)

    {

            if(k>=n*m)

        {

            break;

        }

        a[i][m-x-1]=k%10;

 

    }

    for(j=m-x-2;j>=x;j--,k++)

    {

        if(k>=n*m)

        {

            break;

        }

        a[n-x-1][j]=k%10;

 

    }

    for(i=n-x-2;i>x;i--,k++)

    {

        if(k>=n*m)

        {

            break;

        }

        a[i][x]=k%10;

 

    }

    pai(x+1);

}

int main()

{

    int q=0;

    while(~scanf("%d %d",&n,&m))

    {

 

        k=0;

        pai(0);

        int i,j;

         if(q!=0)

        {

            printf("\n");

        }

        for(i=0;i<n;i++)

        {

            for(j=0;j<m;j++)

            {

                    printf("%d",a[i][j]);

 

            }

                 printf("\n");

        }

        q++;

    }

    return 0; 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值