P1106 刪數問題 / U83355 刪數問題【升級版】
阿新 • • 發佈:2021-07-09
貪心+連結串列
當一個數字比後面一個數字大時,刪去這個數是更優的。
連結串列實現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; }