其他分享
首页 > 其他分享> > JDOJ 2898 删数问题

JDOJ 2898 删数问题

作者:互联网

洛谷 P1106 删数问题

https://www.luogu.org/problemnew/show/P1106

JDOJ 2898: 删数问题

https://neooj.com:8082/oldoj/problem.php?id=2898

Description

输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出新的正整数。(N不超过240位)输入数据均不需判错。

 

Input

【输入】
   n
   s

Output

  最后剩下的最小数。

Sample Input

175438 4

Sample Output

13

HINT

 

例如:n=175438
           s=4
          删数的过程如下:
               n=175438        //删掉7
                   15438          //删掉5
                   1438            //删掉4
                   138              //删掉8
                   13                //解为13

 一道高精度加贪心的题。

这题的贪心策略就是怎么删除数字才能保证剩下的数最小。

原则上选择删除最大的数,但是明显不行。

如果把各位上的数做一个函数图象的话,应该删除峰顶的数,而且越靠前越好。

贪心原则出来了,接下来就是高精度的代码实现。

本人高精度很弱。

所以笨了吧唧地写出的代码,丑到不行。

但是钻了个空子,还是C语言榜单第一。

AC CODE:

#include<stdio.h>
#include<string.h>
char c[260];
int s,cnt;
int main()
{
    scanf("%s%d",c,&s);
    int len=strlen(c);
    while(s--)
    {
        for(int i=0;i<=len-2;i++)
            if(c[i]>c[i+1])
            {
                for(int j=i;j<=len-2;j++)
                    c[j]=c[j+1];
                break;
            }
        len--;
    }
    while(cnt<=len-1 && c[cnt]=='0')
        cnt++;
    if(cnt==len)
        printf("0");
    else
        for(int j=cnt;j<=len-1;j++)
            printf("%c",c[j]); 
    return 0;
} 

 

标签:13,2898,高精度,int,删掉,JDOJ,删数
来源: https://www.cnblogs.com/fusiwei/p/11221014.html