题目大意
从一个 N N N 位数里删去 k k k 个数码,使得剩下的数码组成的数最小。
解题思路
注意到
N
≤
250
N≤250
N≤250,不难想到贪心:
每次删去一个数码,使得剩下的数最小。
即:使删去
k
k
k 个数码后的数最小的数是删去
k
−
1
k-1
k−1 个数码以后的最小的数再删去一个数码得到。
一种错误的思路:每次删去最大的数码。如果有相同数码,删去靠前的。反例: 102 , k = 1 102, k=1 102,k=1。
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int MAXN=250;
int n, k;
char str[MAXN+10];
struct node{
int a[MAXN+10];
int len;
node(){
memset (a, 0, sizeof (a));
len=0;
}
node del (int lc){
node ans; ans.len=len-1;
int now=len-1;
for (int i=len; i>=1; --i){
if (i==lc) continue;
ans.a[now]=a[i];
--now;
}
return ans;
}
void print (){
int tf=0;
for (int i=len; i>=1; --i){
if (a[i]) tf=1;
if (tf) printf ("%d", a[i]);
}
if (!tf) printf ("0");
}
}now, tmp, mn;
int operator< (node a, node b){
if (a.len!=b.len) return a.len<b.len?1:0;
for (int i=a.len; i>=1; --i)
if (a.a[i]!=b.a[i])
return a.a[i]<b.a[i]?1:0;
return 0;
}
int main(){
scanf ("%s", str+1); scanf("%d", &k);
now.len=strlen (str+1);
for (int i=now.len; i>=1; --i)
now.a[i]=str[now.len-i+1]-'0';
for (int i=1; i<=k; ++i){
for (int j=1; j<=now.len; ++j){
tmp=now.del (j);
if (1==j) mn=tmp;
else if (1!=j&&tmp<mn) mn=tmp;
}
now=mn;
}
now.print ();
}