CF988E Divisibility by 25 (思维+字符串)

链接

题意:

给出一个从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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值