Skip to content

Latest commit

 

History

History
72 lines (56 loc) · 1.89 KB

4137.md

File metadata and controls

72 lines (56 loc) · 1.89 KB

最小新整数 4137: 最小新整数

题目要求在给定数字的情况下,求删除k个数字后的最小值。

题目来源

4137: 最小新整数

总时间限制: 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。