给出一个N位数字串,删除任意K位,使剩下的数最大。(单调栈)
10 4
4177252841
775841
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, k, a[100005] = {}, index = 1;
string s;
stack <int> v;
scanf("%d%d", &n, &k);
cin >> s;
for (int i = 1; i <= s.size(); i++) a[i] = s[i - 1] - '0';
for (int i = 1; i <= n; i++)
{
if (a[i] >= v.top())
{
while (!v.empty() && v.top() < a[i] && k) v.pop(), k--;
v.push(a[i]);
}
else v.push(a[i]);
if (k == 0)
{
while (i <= n) v.push(a[i++]);
break;
}
}
memset(a, 0, sizeof(a));
while (!v.empty()) a[index++] = v.top(), v.pop();
index -= 2;
for (int i = index; i > 0; i--) printf("%d", a[i]);
return 0;
}
TLE
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, k, a[100005] = {}, index = 1;
string s;
stack <int> v;
scanf("%d%d", &n, &k);
cin >> s;
for (int i = 1; i <= s.size(); i++) a[i] = s[i - 1] - '0';
for (int i = 1; i <= n; i++)
{
if (!v.empty() && a[i] >= v.top())
{
while (!v.empty() && v.top() < a[i] && k) v.pop(), k--;
v.push(a[i]);
}
else v.push(a[i]);
while (!v.empty() && k && i == n)
{
v.pop();
k--;
}
}
memset(a, 0, sizeof(a));
while (!v.empty()) a[index++] = v.top(), v.pop();
index -= 2;
for (int i = index; i > 0; i--) printf("%d", a[i]);
return 0;
}