题目描述
给定一个十进制正整数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
分析
根据题目描述,我们需要从给定的正整数n中删除k位,使得生成的新整数最小。
我们可以使用贪心算法来解决这个问题。从左到右遍历给定的正整数n,对于每一位数字,如果存在比其大的数字可以删除,并且删除后得到的数字更小,则删除该数字。如果已经删除了k个数字,则停止遍历。
代码
下面是相应的C++代码实现:
#include <iostream>
#include <string>
using namespace std;
string removeDigits(string n, int k) {
string result = "";
int removed = 0;
for (int i = 0; i < n.length(); i++) {
while (removed < k && !result.empty() && result.back() > n[i]) {
result.pop_back();
removed++;
}
result.push_back(n[i]);
}
while (removed < k) {
result.pop_back();
removed++;
}
return result;
}
int main() {
int t;
cin >> t;
while (t--) {
string n;
int k;
cin >> n >> k;
string result = removeDigits(n, k);
cout << result << endl;
}
return 0;
}
在代码中,我们首先读取输入的测试数据组数t,并使用while循环来处理每一组数据。
在每一组数据中,我们读取输入的正整数n和需要删除的位数k,并调用removeDigits函数来计算从n中删除k位后得到的最小整数。
removeDigits函数的实现与之前的代码相同,只是将其封装为一个函数,方便调用和复用。
最后,输出每组数据的结果。