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; }