Delete Numbers(0700)

来源:互联网 发布:数据可视化算法 编辑:程序博客网 时间:2024/05/16 16:58

原题目连接点此处

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

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

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

Output
178543
Sample Input
13
Sample Output
Hint
mryang
题目数据小,直接暴力就可以。
一开始想的太简单了。直接按最大的数开始删,直到删除前k大的数。提交一发,WA。各种数据测试,正常。最后才发现按那样的思路 506 1 就过不了
它会先删除6,得到50,显然先删除5得到06,6要比50小;所以。。。。这就是坑。。。。。
那就不按从大到小,按从前到后,反正只要删除的不是当前最小就好。
假设有这么一组数据xyzzzz;开始比较x,y如果x比y大,那么yzzzz < xzzzz所以删掉x;如果x < y;就一定删掉y吗?不一定。假如y < z;删掉y就是xzzzz,那xzzzz和xyzzz比,前面x一样百位y < z所以不应该删掉y;而应该删掉z;
综上,只要前面一个数大于后面一个,就删除前面一个数;
代码如下:

 #include <stdio.h> #include <string.h>char s[105];void del(int n)//删除第n个数{    int i;    for(i=n;i<strlen(s)-1;i++)    {        s[i]=s[i+1];    }     s[i]='\0';}int main(){    int n,i,j;    while(~scanf("%s",s))    {        scanf("%d",&n);        if(n>=strlen(s))        {            printf("0\n");            continue;        }        for(i=0;i<n;i++)        {            int max=-1;            int pos;            for(j=0;j<strlen(s)-1;j++)            {                if(s[j]>s[j+1])//只要前面一个数大于后面一个,就跳出循环                {                    pos=j;                    break;                }            }            del(pos);        }        for(i=0;s[i]=='0';i++);//跳过前缀0        if(i==strlen(s)) printf("0");        else        for(;i<strlen(s);i++)        {            printf("%c",s[i]);        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击