p.s.自用
题目描述
输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出新的正整数。(N不超过240位)输入数据均不需判错。
输入
输入n和s
输出
输出最后剩下的最小数。
样例输入 Copy
175438 4
样例输出 Copy
13
思路
遍历s次,每一次删除从下标为0开始的非递减序列的最大值(要考虑到该最大值为字符串末尾的情况)。在输出时应注意最后得到的字符串最开始时是否有0存在,若存在,则要考虑输出时整数前不应有0的情况。
参考答案
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <iomanip>
using namespace std;
int main()
{
// 输入
string n; // 高精度正整数
int s;
cin >> n >> s;
// 求解
for (int i = 0; i < s; i++)
{
for (int j = 0; j < n.size(); j++)
{
if (j == n.size() - 1) // 最后一位
{
n.erase(n.end() - 1);
break;
}
int pre = int(n[j] - '0');
int next = int(n[j + 1] - '0');
if (pre > next) // 删除不是非递减序列的最后一位
{
n.erase(n.begin() + j);
break;
}
}
}
// 输出
int flag = 1;
for (int i = 0; i < n.size(); i++)
{
if (flag && n[i] == '0')
continue;
flag = 0;
cout << n[i];
}
}