题目
https://www.luogu.com.cn/problem/P1106
解析
175438要删一个数,使得剩下的数最小
错误贪心策略:总是删除最大的那个数,如175438删除8得到17543;明显不如删除7得到15438小;所以应该对贪心做一些限制
正确的贪心策略为:每一步总是选择一个使剩下的数最小的数字删去。我们想让处在高位的数字尽量小,如1781如果删除7的话,8会顶替7称为新的高位(181),其效果就不如删除8好(171)
如果数列是递增的,则删除最大的那个数,即最后一个数字;否则就删除第一个递减区间的首数字。
需要注意的易错点:前导0的删除,如输入1000 1,结果为0 详见字符串处理
AC代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int n;
int main()
{
while(cin>>s)
{
cin>>n;
for(int i=0;i<n;i++)//每删掉一个数就重新找到递减区间
{
int temp1=0;//要删除的数字 在字符序列里的序号
char temp2=s[0];//要删除的数字
for(int j=0;j<s.size();j++)
{
if(s[j]-'0'<temp2-'0' )//递减
{
s.erase(s.begin()+temp1);
break;
}
else
{
if(j==s.size()-1)//如果数列递增,删掉最后一个数
{
s.erase(s.begin()+j);
}
else
{
temp1=j;
temp2=s[j];
}
}
}
/*
for(int x=0;x<s.size();x++)//去掉前导0
{
if(s[x]=='0') s.erase(s.begin()+x);
else break;
}*/
for(int x=0;x<s.size();x++)//去掉前导0
{
if(s[x]=='0') {s.erase(s.begin()+x);x--;}
else break;
}
}
if(s.size()==0) cout<<0<<endl;
else cout<<s<<endl;
}
}