思路:
确认过眼神,是卡了很久的题
大体思路是对的,在保证后面有足够数的情况下,选择最小的数
刚开始写的时候存在很多问题
这一块代码是改的最久的,刚开始自己随便测了几组数发现了问题之后,发现这里的i忘记重新赋值了,然后又发现应该赋值为-1而不是0,因为之后会先进行++的操作。
最后就是关于这道题目的理解问题,我一直认为留下来的数字如果是000001(前导零去掉)这种应该是不可行的,然后通过测试发现题目要的就是这个。存在歧义的情况下可以把两种情况都是试一试。
在这里插入代码片#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=300;
int k,ans[1111];
char n[MAXN];
struct NUM
{
int a,b;
bool operator<(const NUM &num1){
if(b==num1.b) return a<num1.a;
else return b<num1.b;
}
}num[1111];
int main()
{
cin>>n;//cout<<a<<endl;
cin>>k;
int l=strlen(n); //cout<<l<<" "<<n[1];
for(int i=0;i<l;i++)
{
num[i].a=i;
num[i].b=n[i]-'0';
}
sort(num,num+l);
//for(int i=0;i<l;i++) cout<<num[i].a<<" "<<num[i].b<<endl;
int cnt=1,flag;
for(int i=0;i<l;i++)
{
if(num[i].a<=k)
{
//if(l-k!=1&&num[i].b==0) continue;
//cout<<"i="<<i<<endl;
ans[1]=num[i].b;
flag=num[i].a;
break;
}
}
//cout<<"l="<<l<<"k="<<k<<endl;
for(int i=0;i<l;i++)
{
if(cnt==l-k) break;
if(num[i].a>flag&&num[i].a<=k+cnt)
{
//cout<<"flag="<<flag<<"k+cnt="<<k+cnt<<endl;
cnt++;
ans[cnt]=num[i].b;
flag=num[i].a;
i=-1;
//cout<<"flag="<<flag<<"k+cnt="<<k+cnt<<"cnt="<<cnt<<endl;
}
}
int mark=0;
for(int i=1;i<=cnt;i++)
{
if(ans[i]!=0||mark==1)
{
mark=1;
cout<<ans[i];
}
}
if(mark==0) cout<<"0"<<endl;
return 0;
}
//632894679234 7
//967564292107 8