链接:https://ac.nowcoder.com/acm/contest/301/J
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。

输入描述:
多组数据输入

对于每组数据,只有一行输入一个整数n(1 <= n <= 1000000000)。
输出描述:
如果经过最少x次操作后,这个数就变成了25的倍数,那么输出x;

如果这个数无论怎么变化都变不成25的倍数,输出-1.
示例1
输入

复制
2018
输出

复制
-1
示例2
输入

复制
2020
输出

复制
1
说明

经过一次之后变成2200

能整除25的最后两位只有4种:00,25,50,75
先判断是否有这种情况,如果有就算一下操作数,最后输出所以操作数里的最小值

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    string s;
    while(cin>>s){
        bool y0[15],y2[15],y5[15],y7[15];
        int t0=0,t2=0,t5=0,t7=0;
        memset(y0,0,sizeof(y0));
        memset(y2,0,sizeof(y2));
        memset(y5,0,sizeof(y5));
        memset(y7,0,sizeof(y7));
        int m=s.size()-1;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='0') {
                y0[i]=true;
                t0++;
            }
            else if(s[i]=='2') y2[i]=true,t2++;
            else if(s[i]=='5') y5[i]=true,t5++;
            else if(s[i]=='7') y7[i]=true,t7++;
        }
        if(t0<2&&(t2==0||t5==0)&&(t5==0||t0==0)&&(t7==0||t5==0))
        printf("-1\n");
        else{
            int temp=999999999;
            if(t0>=2){//00
                int t=0,flag=0;
                for(int i=m;i>=0;i--){
                    if(y0[i]&&flag<2) t+=m-i,flag++;
                    if(flag>=2) {
                        t-=1;
                        break;
                    }
                }
                temp=min(t,temp);
            }
            if(t2&&t5){//25
                int t=0,p;
                for(int i=m;i>=0;i--){
                    if(y5[i]) {
                        t+=m-i;
                        p=i;
                        break;
                    }
                }
                for(int i=m;i>=0;i--){
                    if(y2[i]){
                        t+=m-1-i;
                        if(p<i) t+=1;
                        break;
                    }
                }
                temp=min(t,temp);
            }
            if(t5&&t0){//50
                int t=0,p;
                for(int i=m;i>=0;i--){
                    if(y0[i]) {
                        t+=m-i;
                        p=i;
                        break;
                    }
                }
                for(int i=m;i>=0;i--){
                    if(y5[i]){
                        t+=m-1-i;
                        if(p<i) t+=1;
                        break;
                    }
                }
                temp=min(t,temp);
            }
            if(t7&&t5){//75
                int t=0,p;
                for(int i=m;i>=0;i--){
                    if(y5[i]) {
                        t+=m-i;
                        p=i;
                        break;
                    }
                }
                for(int i=m;i>=0;i--){
                    if(y7[i]){
                        t+=m-1-i;
                        if(p<i) t+=1;
                        break;
                    }
                }
                temp=min(t,temp);
            }
            printf("%d\n",temp);
        }
    }
    return 0;
}