AC代码:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
int main()
{
string s;
int i,j,k;
cin >> s >> k ;
if(k==0)
{
cout << s << endl ;
return 0;
}
int next=0;
for(i=0;i<k;i++)
{
for(j=0;j<s.size();j++)
{
if(j==s.size()-1){//找到了最后一个数还没有找完,证明已经都是升序排列了,直接标记最后一位
s[j]='x';
//cout << "1" << endl ;
break;
}
while(next<=j||s[next]=='x')
{
//cout << next << " " << j << endl ;
next++;//不能找已经被标记的
}
if(s[j]!='x'&&s[j]>s[next])//如果发现降序,则标记
{
s[j]='x';
//cout << "2" << endl ;
break;
}
}
next=0;
}
int f=1;
for(i=0;i<s.size();i++)
{
if(s[i]=='0'&&f)continue;//如果是无效0就跳过
if(s[i]!='x')
{
cout << s[i] ;
f=0;
}
}
if(f)cout << "0" << endl ;//到最后也没有一个有效数字输出,即为输出0的情况
return 0;
}
PS:防止以后自己看不懂,写在这里
关于代码有一点困扰了我很久,就是当数字全部是升序排列之后,表面上看是没办法再进行标记的,思考再三之后发现,因为是用的字符串类型的变量,全部升序并且没标记完时,会把最后一位标记为x,按照ASCII码来说,数字是排在字母前面的,所以当数字全部升序之后,会先进入一次第一种情况,然后会进入第二种情况。
下面是我用
123456
3
进行调试的结果