解题思路:删数问题也是经典的贪心问题。解题思路肯定不是哪个大删哪个,需要从左到右比对这个序列,如果左边的数大于右边的数则删除,因为左边代表的高位,只有高位越小这个数才越小。需要注意的是删除完这个数后可能会出现一堆前导的0
下面附上ac代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
char s[245];
cin>>s;
int n;
cin>>n;
int len=strlen(s);
if(len==n)
{
cout<<0<<endl;
return 0;
}
int step=n;
for(int i=0;i<len-1;i++)
{
if(s[i]>s[i+1]&&step!=0){
step--;
for(int j=i;j<len-1;j++)
{
s[j]=s[j+1];
}
i=-1;
}
}
int i;
int flag=0;
for(i=0;i<len-n;i++)
{
if(s[i]=='0'){
continue;
flag=1;
}
else break;
}
if(flag==1) i--;
for(;i<len-n;i++)
{
cout<<s[i];
}
cout<<endl;
//system("pause");
return 0;
}
利用string自带的函数解决问题 ,代码会更简明一点
#include <bits/stdc++.h>
using namespace std;
int main()
{
string n;
int s;
cin>>n>>s;
int len=n.size();
while(s)
{
for(int i=0;i<len-1;i++)
{
if(n[i]>n[i+1]){
n.erase(i,1);
break;
}
}
len--;
s--;
}
int i=0;
while(n[i]=='0'&&len>=1)
{
n.erase(i,1);
len--;
}
for(int i=0;i<len;i++)
{
cout<<n[i];
}
cout<<endl;
//system("pause");
return 0;
}