贪心算法之最小新整数详解(仅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;
}