湖南长沙培训Day.3

贪心算法之最小新整数详解(仅30行代码)新鲜出炉!!!初学者看过来,免费的保姆级教学,保证让你轻松学会!

题目如上,可知我们要先输入一个数t,然后输入t个数,接着输入数n和要删掉的次数k,所以这里就要用到循环(for或者while均可,这里用的是for)

这时我们定义字符串n,方便后续删除等操作。随后我们要读取字符串的长度,用到.length()这个函数,随后进入循环(for),进行k次删除操作。

在循环里面当j小于字符串的长度时,通过枚举字符串中的数,找到规律,执行k次删除,同时将字符串转化为实型,进行比较。

此时我们开始找规律,不难发现,如12873这个数,如果删一次,我们会删8,为什么呢?我们知道12873在前4个数字前为递增(不看8),8改变了单调性,所以删掉它;同理,留下1273,再删,删7;此时留下123,是具有单调递增性质的数,如果要再次删除,那么要删哪一个呢?显而易见,要删3,即单调递增时,删除最后一个数。好那么我们已经找到了所有规律:

{当单调性改变时,删掉那个“捣蛋鬼”;

{当单调性不变时,删掉那个“拖油瓶”;

将这些语句转化为代码时,需要用到if语句(这里“||”是“或者”的意思)和函数.erase(),同时要及时break跳出循环,防止多删或误删。

是不是以为完了?不是的,不知道你有没有发现,如果仅靠以上语句进行删除操作,假设要删的数为1004时,要删掉1对吧?可删了1之后,会滞留下两个0,显然不符合要求,那么此时应该怎么办呢?我们不妨再写一条语句,用来判断:当删除后留下0时,顺手把0也删掉。转化为代码则如下。

此时这份代码就算完成了,输出结果即可。

都看到这里了,给小编一个点赞评论收藏加关注呗,感谢您的支持!

完整代码如下:

#include <bits/stdc++.h>
using namespace std;
int main ()
{
    int t,k;
    cin >> t;
    string n;
    for (int i = 1;i <= t;i++) 
    {
        
        cin >> n >> k;
        int len = n.length();
        for (int l = 1;l <= k;l++) 
        {
            for (int j = 0;j < len;j++)
            {
                int a = n[j] - '0';
                int b = n[j + 1] - '0'; 
                if (a > b || j + 1 == len)
                {
                    n.erase(j,1);
                    break; 
                }    
            }
        }
        while(n[0] == '0' && n[1]) 
            n.erase(0,1);
        cout << n << endl;
    }
    return 0;
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值