[贪心]删数问题

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

问题源地址:
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2072.html

Problem Description

键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。

Input

输入有多组 每组包括原始数n,要去掉的数字数s;

Output

输出去掉s个数后最小的数

Example Input

178543 4

Example Output

13

My code

#include <stdio.h>
#include <string.h>

#define L 101

int main()
{
    int i, j, k, m, n, t, c;
    char ch[L], s;
    while(~scanf("%s %d", ch, &n))
    {
 //从高位开始寻找递减区间的第一位并删除
 //当整组数据无递减区间时,最后一位数字与字符串结尾的'\0'构成递减区间并被删除
        while(n--)
        {
            m = strlen(ch);
            for(i = 0; i < m; i++)
            {
                if(ch[i] > ch[i + 1])
                {
                    for(j = i; ch[j] != 0; j++)
                    {
                        ch[j] = ch[j + 1];
                    }
                    break;
                }
             }
        }
        /************/
//输出时忽略第一位非零数字前的数字0
        c = 0;
        for(i = 0; ch[i] != 0; i++)
        {
            if(ch[i] != '0'||(ch[i] == '0'&&c))
            {
                printf("%c", ch[i]);
                c++;
            }
        }
//当数组中所有非零数字均被删除时,输出"0"
        if(c)
            printf("\n");
        else
            printf("0\n");
    }
    return 0;
}

Hint

输出时注意对有效数字前的0的处理,以及全零串和空串的输出格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值