![](https://img-blog.csdnimg.cn/e1816607e0a04de88df74487eeb848be.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATkNVLXdmYg==,size_20,color_FFFFFF,t_70,g_se,x_16)
- 分析: 我们可以先思考一下。当删除一个长数中的一个数字时,为了得到更小的一个数,是删除最大的那个数呢,还是删除最前面的那个“峰”呢?
- 假设一个数为154389,当我们要删除一个数使其最小,如果是删除最大的数,则为15438;而如果是删除最前面的“峰”,则为14389。很明显,我们应选择后者;
- 原因:当我们删除一个数时,不管是删除哪个位置上的,得到的数值的位数都相同的。这时如果要比较最小的,我们可以知道当靠前的位数比其他选择的数更小,就能得到更小的。依次类推,逐步除峰值即为所求。
- 算法:首先将输入的字符串转进一个数组进行存储。我们只需要进行循环遍历,逐步删除a[j] > a[j+1]的a[j],再将后面的数都往前移动进行填充空位。最后,记得判断删除前导数0
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n[255]={0}, k;
string num;
cin >> num;
cin >> k;
int length = num.length();
for (int i = 0; i < length; ++i) {
n[i] = num[i]-'0';
}
for (int i = 0; i < k; ++i) {
for (int j = 0; j < length; ++j) {
if(n[j] > n[j+1]) {
for (int s = j; s < length; ++s) {
n[s] = n[s+1];
}
length--;
break;
}
}
}
int i,l=0;
while (n[i]==0 && l<length-1) {
i++;
l++;
}
for (int j = l; j < length; ++j) {
cout << n[j];
}
return 0;
}