链接
题意:
给出一个从1到 1 0 18 10^{18} 1018的整数n,但不包含前导零。 在一次移动中,您可以交换给定数字中的任意两个相邻数字,使得结果数字不会包含前导零。 换句话说,在每次移动后,您所拥有的数字都不能包含任何前导零。 获取可被25整除的数字所需的最小移动次数是多少? 如果无法获得可被25整除的数字,则打印-1.
分析:
因为结果要是25的倍数。所以最后两个一定要是
00
,
25
,
50
,
75
00,25,50,75
00,25,50,75.然后就是考虑移动完前缀0的问题。
我们可以对这四种情况分开考虑,从后面找要求得到两个字符,然后将其从字符串中删掉,最后统计一下前缀0的数量。
这里从后面找字符,我们用到rfind()函数:写一下stl
string str;
int f(char a,char b){
string s=str;
int len=s.size();
int p1 = s.rfind(b);
if(p1==-1) return mod;
s.erase(p1,1);
int p2 = s.rfind(a);
if(p2==-1) return mod;
s.erase(p2,1);
int sum=0;
while(s[sum]=='0') sum++;
return sum+(len-1-p1)+(len-2-p2);
}
void solve(){
cin>>str;
int ans=min(f('0','0'),f('2','5'));
ans=min(ans,f('5','0'));
ans=min(ans,f('7','5'));
if(ans==mod) puts("-1");
else cout<<ans<<endl;
}