p1106删数问题

这是一道贪心的问题,我们要从一个数字中删掉k个数字来达到其最小值,如果这个数字有n位,那我们是不是自然而然想到最后他要剩下n-k位数字,那么我们就可以想到从第1位到第k+1位取到最小的数字(因为数字的相对位置不变,至少要留下后面的n-k-1个数字以达到n-k位),之后在找到了这个第一个最小的数字之后,我们标记为mark,然后我们再从mark+1往后找k个数,以此类推我们就有了大概的思路。代码如下

#include<bits/stdc++.h>
using namespace std;
string s;
int k,n,mark=0,flag=0,tmp;
//k为删除的个数,n为位数,s为数字串,mark为标记,flag用于判断当前是否是数字头。
//tmp为临时变量。
int find(int l, int r)//定义一个函数寻找l到r中的最小数。
{
    char minc = s[l];//初始化最小数为s[l]
    mark = l + 1;
    for (int i = mark; i <= r;i++)
    {
        if(s[i]<minc)
        {
            minc=s[i];
            mark = i + 1;//更新左边界mark
        }
    }
    return minc-'0';//找出最小数后return一个整数型便于判断。
}
int main()
{
    cin >> s >> k;
    n = s.size();
    for (int i = 0; i < n - k;i++)//数字串从0开始,所以n-k-1变成n-k。
    {
        tmp = find(mark, k + i);//找出对应范围的最小值。
        if(tmp==0&&flag==0)//判断tmp是否为0且是否是数字头
        {
            continue;//如果是的话就不输出,因为0不能作为头。
        }
        flag = 1;//如果不是的话flag变为1,后续的0就可以输出了
        cout << tmp;
    }
    if(flag==0) cout<<0;//要特判flag一直为0的情况。
    return 0;
}

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值