序号:#9难度:困难时间限制:500ms内存限制:10M
描述
有一行由 N 个数字组成的数字字符串,字符串所表示的数是一正整数。移除字符串中的 K 个数字,使剩下的数字是所有可能中最小的。
假设:
- 字符串的长度一定大于等于 K
- 字符串不会以 0 开头
输入
一行由 N 个数字组成的数字字符串(0 < N < 20),和一个正整数 K(K < N),两个数据由空格隔开,如:1432219 3。
输出
移除 K 位后可能的最小的数字字符串。 如 1432219 移除 4, 3, 2 这 3 个数字后得到 1219,为所有可能中的最小值。
输入样例
1432219 3 10200 1
复制样例
输出样例
1219 200
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[25];
queue<int> q[15];
int ans[25];
int main(){
int k;
while(~scanf("%s%d",s,&k)){
for(int i=0;i<=9;i++){
while(!q[i].empty()) q[i].pop();
}
int len=strlen(s);
for(int i=0;i<len;i++){
q[s[i]-'0'].push(i);
}
int n=len-k;
int pos=-1;
for(int i=1;i<=n;i++){
bool flag=false;
for(int j=0;j<=9;j++){
while(!q[j].empty()&&q[j].front()<=pos) q[j].pop();
if(!q[j].empty()&&len-q[j].front()>=n-i+1){
ans[i]=j;
pos=q[j].front();
flag=true;
break;
}
}
}
ll num=0;
for(int i=1;i<=n;i++){
num=num*10+ans[i];
}
printf("%lld\n",num);
}
return 0;
}