A - 删数问题SDUT

A - 删数问题
Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入有多组 每组包括原始数n,要去掉的数字数s;
Output
输出去掉s个数后最小的数
Sample
Input
178543 4
Output
13
Hint

贪心算法的基础题型
注意事项(删除顺序的问题)
删除递减序列中的第一个数字并且要删除大的那个数字,从头寻找,不要在数组的持续寻找,第一个示例代码是wrong

#include 
#include 
int main()
{
    int i,len,s;
    char a[101];
    while(~scanf("%s %d",a,&s))
    {
        while(s--)
        {
            i=0;
            len=strlen(a);
            while(i<len)//错误(一直在该序列中向下寻找)
            {
                if(a[i]<=a[i+1])
                    i++;
                else
                {
                    a[i]=a[i+1];
                    i++;
                }
            }
        }
        i=0;
        len=strlen(a);
        if(i<len)//注意输出形式
        {
            while(i<len&&a[i]=='0')//(假设00001)
                i++;
            if(i==len)//(假设9000已经把9删除了,只剩下了0)
                printf("0");
            for(; i<len; i++)
                printf("%c",a[i]);
        }
        else//(最后没有位数)
            printf("0");
        printf("\n");
    }
        return 0;

}

以下为正确代码

#include 
#include 
int main()
{
    int i,s,len;
    char a[101];
    while(~scanf("%s %d",a,&s))
    {

        while(s--)
        {
            i=0;
            len=strlen(a);
            while(i<len&&a[i]<=a[i+1])//直至找到递减的序列
                i++;
            while(i<len)//找到后删除干净,再找下一个序列
            {
                a[i]=a[i+1];
                i++;
            }
        }
        len=strlen(a);
        i=0;
        if(i<len)
        {
            while(i<len&&a[i]=='0')
                i++;
            if(i==len)
                printf("0");
            for(;i<len;i++)
                printf("%c",a[i]);
        }
        else printf("0");
        printf("\n");
    }
    return 0;

}

你可能感兴趣的:(数据结构,贪心)