P1106 删数问题 / U83355 删数问题【升级版】

P1106 删数问题 / U83355 删数问题【升级版】

贪心+链表

当一个数字比后面一个数字大时,删去这个数是更优的。

链表实现O(1)单点删除操作。

注意删去前导0,并且注意答案为0时不要删光了

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=500005;
char q[N];
int a[N],L[N],R[N],lq,s;
int main(){
    int T; scanf("%d",&T);
    while(T--){
        scanf("%s",q);
        lq=strlen(q);
        for(int i=1;i<=lq;++i)
            L[i]=i-1,R[i]=i+1,a[i]=q[i-1]-'0';
        L[lq+1]=lq; R[0]=1;
        scanf("%d",&s);
        for(int i=1;i!=lq+1&&s;){ 
            if(a[i]>a[R[i]]){
                R[L[i]]=R[i];
                L[R[i]]=L[i];
                i=L[i]; --s;
            }else i=R[i]; 
        } 
        for(int i=L[lq+1];i&&s;i=L[i]) R[L[i]]=lq+1,--s;
        bool k=0;
        for(int i=R[0];i!=lq+1;i=R[i])
            if(a[i]||k) printf("%d",a[i]),k=1;
        if(!k) printf("0");
        puts(""); 
    } 
    return 0;
}

 

posted @ 2021-07-09 20:14  kafuuchino  阅读(73)  评论(0编辑  收藏  举报