從給定的串中挑出來m個數使得剩餘的數字最小,串的序列不能改變php
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> using namespace std; const int maxn = 1005; int minindex[maxn][10],data[maxn],res[maxn]; inline void init(int len) { for(int i=1; i<=len; ++i) minindex[i][0]=i; for(int j=1; j<=10; ++j) { for(int i=1; i<=len; ++i) { if((i+(1<<j)-1)<=len) { int t1=minindex[i][j-1],t2=minindex[i+(1<<(j-1))][j-1]; if(data[t1]<=data[t2]) minindex[i][j]=t1; else minindex[i][j]=t2; } } } } inline int ask(int l, int r) { int k=31-__builtin_clz(r-l+1); int t1=minindex[l][k],t2=minindex[r-(1<<k)+1][k]; if(data[t1]<=data[t2]) return t1; else return t2; } int main() { char s[1005]; int n,len,l,r,ip1,ip2; while(~scanf("%s %d",s,&n)) { memset(minindex,0,sizeof(minindex)); len=strlen(s); for(int i=0; i<len; ++i) { data[i+1]=s[i]-'0'; } if(n>=len) { printf("0\n"); continue; } init(len); len=len-n; l=1,r=n+1; ip2=1; for(int i=1; i<=len; ++i) { ip1=ask(l,r); res[ip2]=data[ip1]; ++ip2; l=ip1+1; ++r; } ip2--; for(l=1; l<=ip2; ++l) { if(res[l]) break; } if(l>ip2) { printf("0\n"); continue; } for(int i=l; i<=ip2; ++i) printf("%d",res[i]); printf("\n"); } return 0; }