http://acm.hdu.edu.cn/showproblem.php?pid=3183
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2515 Accepted Submission(s): 983
#include<iostream> #include<string.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<queue> using namespace std; #define N 110000 #define MOD 100000007 char s[N]; int a[N], m; int Find(int k); void Print(); void Slove(int k); int main() { int n; while(scanf("%s%d", s, &n)!=EOF) { int i, j; m=n; memset(a, 0, sizeof(a)); for(i=0; s[i]; i++) a[i] = s[i]-‘0‘; i=0; while(1) { int next = Find(i); if(next==0 || next-i>m) break; for(j=i; j<next; j++) { a[j] = -1; m--; } i = next; while(a[i]==0) i++; } Slove(i); Print(); } return 0; } void Slove(int k) { int i, j, index, len=strlen(s)-1; while(1) { if(m==0) break; index=-1; for(i=k; i<=len; i++) { if(a[i]==-1) continue; j = i+1; while(a[j]==-1) j++; if(a[i]>a[j]) { index = i; break; } } if(index==-1) break; a[index] = -1; m--; } } int Find(int k) { int i; for(i=k+1; s[i]; i++) { if(a[i]==0) return i; } return 0; } void Print() { int i, j, flag=0; for(i=0; s[i]; i++) { if(a[i]!=0 && a[i]!=-1) break; } for(j=i; s[j]; j++) { if(a[j]!=-1) { printf("%d", a[j]); flag = 1; } } if(!flag) printf("0"); printf("\n"); }
原文:http://www.cnblogs.com/YY56/p/4965013.html