这是一道贪心的问题,我们要从一个数字中删掉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;
}