题目要求在给定数字的情况下,求删除k个数字后的最小值。
总时间限制: 1000ms 内存限制: 65536kB
给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0 < k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456
第一行t, 表示有t组数据;
接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。
t行,每行一个数字,表示从n中删除k位后得到的最小整数。
2
9128456 2
1444 3
12456
1
越靠近前面的数字对数值的影响越大,因此我们可以从最前方开始删除数字,当当前数字大于后续的数字时,就认为删除该数字能够显著减小数值。 如此删去k个数字的结果就应当为最小值。
#include <iostream>
#include <string>
using namespace std;
int main() {
int t, i, k, j;
cin >> t;
for (i = 0; i < t; ++i) {
string str;
cin >> str >> k;
int idx = 0;
for (j = 0; j + 1 < str.length(); ++j) {
if (str[j] > str[j + 1]) {
str.erase(str.begin() + j);
j = j - 2 > -1 ? j - 2 : -1;
idx++;
}
if (idx == k) {
break;
}
}
cout << str.substr(0, str.length() - k + idx) << endl;
}
return 0;
}
4137.cpp 代码长度:441B 内存:128kB 时间:1ms 通过率:86% 最小内存:128kB 最短时间:0ms
对于较长的数字应当使用字符串来存储和处理,对于需要经常从中间删除数字的情况,可能使用list效率会更高。
有任何的改进意见欢迎大家在微信平台公众号主页面留言或者发表issue。