有一个长度为n(n <= 240)的正整数,从中取出k(k < n)个数,使剩余的数保持原来的次序不变,求这个正整数经过删数之后最小是多少。
题目分析
这是一个贪心问题
删除k个数后让原来的数最小
让原来的数用string来存,长度为l,删除数字实际上就是删字符
我们删除数字时,应该从高位往低位删,保证每次删除都可以得到一个更小的数
如:2134,这时应该先删除2得到123,而不是删除4
第一次删除:每一次删除前一个比后一个大的数,共删除到l-1位长度
如:178543删除过程为
第一次:删除5 17843
第二次:删除4 1783
第三次:删除8 173
第四次:删除7 13
如果要删除5个数字呢?
显然只删除一次是不够的
第二次删除:经过第一次删除后,得到的是从小到大排列的字符串
上面删除到第四次后还有13
第五次删除应该删除3
所以我们从这里开始从后往前删除
第三次删除
删除前导0操作,比如如果是103,删除一次后得到的是03
这样就要删除前面的0
最后的结果是3
#include<bits/stdc++.h>
using namespace std;
int main() {
string n;
int k;
cin >> n >> k;
int l = n.length();
for (int i = 0; i < l - 1; i++) {// 从高位向低位遍历,删除比后一位大的数
while (k > 0 && i < n.length() - 1 && n[i] > n[i + 1]) {
n.erase(i, 1);
k--;
if (i > 0) {
i--; // 回退一步,重新检查当前位置
}
}
}
while (k > 0) {// 处理剩余的删除次数
n.pop_back();
k--;
}
while (n[0] == '0' && n.length() > 1) {// 删除前导0
n.erase(n.begin());}
cout << n;
return 0;
}
测试结果
178543 4
13