键盘输入一个高精度的正整数 N N N(不超过 250 250 250 位),去掉其中任意 k k k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N N N 和 k k k,寻找一种方案使得剩下的数字组成的新数最小。
输入两行正整数。
第一行输入一个高精度的正整数 n n n。
第二行输入一个正整数 k k k,表示需要删除的数字个数。
输出一个整数,最后剩下的最小数。
175438
4
13
#include
#include
#include
using namespace std;
string s; int k; vector<char> st;
int main()
{
cin >> s >> k;
if (s.size() <= k) {
cout << 0;
return 0;
}
for (int i = 0; i < s.size(); i++) {
if (st.empty() || (st[st.size() - 1] <= s[i]) && (st.size() < s.size() - k)) {
st.push_back(s[i]);
}
else if (s[i] < st[st.size() - 1]) {
int l = 0, r = st.size() - 1, mid;
while (l < r) {
mid = (l + r) / 2;
if (st[mid] > s[i])
r = mid;
else
l = mid + 1;
}
if (s.size() - k - r <= s.size() - i) {
while (st.size() >= r + 1)
st.pop_back();
st.push_back(s[i]);
}
else {
while (s.size() - k - st.size() <= s.size() - i - 1)
st.pop_back();
st.push_back(s[i]);
}
}
}
bool flag = 0;
for (int i = 0; i < st.size(); i++) {
if (st[i] != '0') {
flag = true;
}
if (flag) {
cout << st[i];
}
}
if (!flag)
cout << 0;
return 0;
}
思路:
定义一个栈用于存储最后会留下的数。
根据贪心的思想,位数相同的两个数作比较,只要高位数字越小整个数字就越小,举例199和300.
遍历整个字符串,于是对于每个数字可分为可以直接入栈的情况和需要考虑后决定是否入栈的情况:
做完这一切之后,得到的字符串可能以0开头,也可能被删光了,所以要做一些特殊处理,dddd