给出一个N位数字串,删除任意K位,使剩下的数最大。

给出一个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;
}