CodeForces ~ 988E ~ Divisibility by 25 (模拟)

题意:给你一个数字 n(n1e18) n ( n ≤ 1 e 18 ) ,你每次可以交换他的相邻的两位上的数字,使得这个整数变为整除25的数字的最小步数为多少?如果不能输出-1。

思路:整除25,那么末尾两位为:00,25,50,75时均可以,模拟每种情况,求一个最小值就好。

#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000007;
int ans;
string str;
void solve(char a, char b)
{
    string s = str;
    int cnt1 = s.rfind(a), cnt2 = s.rfind(b);
    if (a == '0' && b == '0') cnt1 = s.rfind(a, cnt1-1);
    if (cnt1 == string::npos || cnt2 == string::npos)
        return ;
    int cnt = 0;
    //对于ab的情况,我们先把b移动到最后一位,然后把a移动到倒数第二位
    //如果b在a前面,我们先把b看作a,a看作b,移动到最后两位后,交换ba即可
    if (cnt1 > cnt2) cnt++, swap(cnt1, cnt2);
    for (int i = cnt2; i+1 < s.size(); i++) cnt++, swap(s[i], s[i+1]);
    for (int i = cnt1; i+1 < s.size()-1; i++) cnt++, swap(s[i], s[i+1]);
    //如果操作完以后第一位为'0'了,那么我们找到第一个不为0的数字,把他交换到第一位即可
    cnt += find_if(s.begin(), s.end(), [](char c){ return c != '0'; }) - s.begin();
    ans = min(ans, cnt);
}
int main()
{
    cin >> str;
    ans = INF;
    solve('0', '0');
    solve('2', '5');
    solve('5', '0');
    solve('7', '5');
    if (ans == INF) ans = -1;
    printf("%d\n", ans);
    return 0;
}
/*
507
52231
50267
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值