keks (删数问题)

来源:互联网 发布:威盾软件 编辑:程序博客网 时间:2024/06/16 07:06


问题 K: keks

时间限制: 1 Sec  内存限制: 128 MB

题目描述

给出一个n位数,要求删掉其中k位数字,使得剩下的数字组成的数尽量大。

输入

第1行:两个正整数n, k(1 <= k < n <= 500,000)。
第2行:一个n位正整数(无前导0)。

输出

输出一行,一个正整数,表示剩下的数的最大值。

样例输入

4 2
1924

样例输出

94




分析:
题目还是相当经典的     要想使删数结束后留下的数字最大    那么我们就需要尽可能的使剩下的数字呈降序的形式

也就时说我们每次删掉第一个递增得数字就好了   但是数据量有点大   暴力会T   优化一下    每次删掉数字前递减的就ok 了    



AC代码:

#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#include <vector>#include <stack>#include <queue>#include <map>#include <set>#include<list>#include <bitset>#include <climits>#include <algorithm>#define gcd(a,b) __gcd(a,b)#define mset(a,n) memset(a,n,sizeof(a))#define FINfreopen("input.txt","r",stdin)#define FOUT freopen("output.txt","w",stdout)typedef long long LL;const LL mod=1e9+7;const int INF=0x3f3f3f3f;const double PI=acos(-1.0);using namespace std;string a;int vis[500005];int main (){    int n,k;    memset(vis,0,sizeof(vis));    while (cin>>n>>k){        cin>>a;        int l=0,r=1;        while (k&&r<n){            while (k&&l>=0&&a[r]>a[l]){//    删掉r之前的降序的数                if (vis[l]) l--;                else vis[l]=1,k--;            }            l=r;r++;        }        r--;        while (k&&r>=0){//    序列降序后从后向前删            if(!vis[r]) vis[r]=1,k--;            r--;        }        int flag=0;        for (int i=0;i<n;i++)            if (!vis[i]) cout<<a[i],flag=1;        if (!flag) cout<<"0";        putchar('\n');    }    return 0;}