这个题一开始从“需要多少个数字”来考虑了,想从数字本身的大小来考虑。但是数字位数也是很重要的一个标准,所以这样必WA。
正确的方法,还是要从左边扫到右边。比较答案的最后一个与输入的下一个,如果输入的下一个比较大,那么将原答案的划掉。如果输入的下一个比较小,那么输入下一个。如果最后答案长度长于需要长度,说明d>0,继续将末尾的划掉即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 1000;
char num[maxn];
int n, d, A[maxn];
int main(void){
while(scanf("%d %d",&n,&d)==2&&n){
int p=0;
scanf("%s",num);
for(int i=0;i<n;i++){
while(d&&p&&A[p-1]<num[i]-'0'){
p--;
d--;
}
A[p++]=num[i]-'0';
}
while(d--){
p--;
}
for(int i=0;i<p;i++){
printf("%d",A[i]);
}
putchar('\n');
}
return 0;
}
int main(void){
int n,d;
while(scanf("%d %d",&n,&d)&&n){
char s[100000+5];
bool ss[100000+5]={false};
int num[10]={0};
scanf("%s",s);
int l = strlen(s);
for(int i=0;i<l;i++){
num[s[i]-'0']++;
}
int pos=10,remain=n-d,r=remain,ct=0;;
while(r>0){
pos--;
r-=num[pos];
printf("pos=%d r=%d",pos,r);
}
for(int k = 9;k>=pos;k--){
for(int i=l;i>-1;i--){
if(s[i]-'0'==k){
ss[i]=true;
ct++;
}
if(ct==remain){
break;
}
}
}
for(int i=0;i<l;i++){
if(ss[i]){
printf("%c",s[i]);
}
}
printf("\n");
vector<int> ans;
for(int i=0;i<l;i++){
if(s[i]-'0'>=pos){
ans.push_back(s[i]-'0');
}
if(ans.size()==remain){
break;
}
}
for(int i=0;i<ans.size();i++){
cout<<ans[i];
}
cout<<endl;
}
}