E. Divisibility by 25 【枚举】

时间:2022-12-30 11:30:30

E. Divisibility by 25

这题没什么好解释的

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
#define debug puts
#define setp cout << fixed << setprecision(15)
#define fst ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
const int N=5e4+5;
const int MOD=998244373;
int cnt[100];
int main(void){
    ll n;
    scanf("%lld",&n);
    string s=to_string(n);
    for(auto ch:s)  cnt[ch-'0']++;
    int sz=(int)s.size();
    if(sz<=2){
        if(n==25|| n==50||n==75) printf("0\n");
        else if(n==52 || n==57) printf("1\n");
        else    printf("-1\n");
        return 0;
    }

    int ans=1e9+9;

    if(cnt[0]>=2){
        string t=s;
        int te=0;
        int index;
        for(int i=sz-1;i>=0;i--){
            if(t[i]=='0'){
                index=i;
                break;
            }
        }
        for(int i=index+1;i<=sz-1;i++)   swap(t[i],t[i-1]),te++/*,cout <<"i="<<i<<" te="<<te<<endl*/;
        for(int i=sz-2;i>=0;i--){
            if(t[i]=='0'){
                index=i;
                break;
            }
        }
        for(int i=index+1;i<=sz-2;i++)   swap(t[i],t[i-1]),te++;
        ans=min(ans,te);
    }

    if(cnt[2]>=1&&cnt[5]>=1){
        string t=s;
        int te=0;
        int index;
        for(int i=sz-1;i>=0;i--){
            if(t[i]=='5'){
                index=i;
                break;
            }
        }
        for(int i=index+1;i<=sz-1;i++)   swap(t[i],t[i-1]),te++/*,cout <<"i="<<i<<" te="<<te<<endl*/;
        for(int i=sz-2;i>=0;i--){
            if(t[i]=='2'){
                index=i;
                break;
            }
        }
        for(int i=index+1;i<=sz-2;i++)   swap(t[i],t[i-1]),te++;
        int cnt=0;
        for(int i=0;i<sz;i++){
            if(t[i]=='0')   cnt++;
            else    break;
        }

        if(sz-cnt>=3)
        ans=min(ans,te+cnt);
    }

    if(cnt[0]>=1&&cnt[5]>=1){
        string t=s;
        int te=0;
        int index;
        for(int i=sz-1;i>=0;i--){
            if(t[i]=='0'){
                index=i;
                break;
            }
        }
        for(int i=index+1;i<=sz-1;i++)   swap(t[i],t[i-1]),te++/*,cout <<"i="<<i<<" te="<<te<<endl*/;
        for(int i=sz-2;i>=0;i--){
            if(t[i]=='5'){
                index=i;
                break;
            }
        }
        for(int i=index+1;i<=sz-2;i++)   swap(t[i],t[i-1]),te++;

        int cnt=0;
        for(int i=0;i<sz;i++){
            if(t[i]=='0')   cnt++;
            else    break;
        }
//        cout << t<< endl;
//        printf("~~~%d\n",te+cnt);
        if(sz-cnt>=3)
        ans=min(ans,te+cnt);
    }

    if(cnt[5]>=1&&cnt[7]>=1){
        string t=s;
        int te=0;
        int index;
        for(int i=sz-1;i>=0;i--){
            if(t[i]=='5'){
                index=i;
                break;
            }
        }
        for(int i=index+1;i<=sz-1;i++)   swap(t[i],t[i-1]),te++/*,cout <<"i="<<i<<" te="<<te<<endl*/;
        for(int i=sz-2;i>=0;i--){
            if(t[i]=='7'){
                index=i;
                break;
            }
        }
        for(int i=index+1;i<=sz-2;i++)   swap(t[i],t[i-1]),te++;
                int cnt=0;
        for(int i=0;i<sz;i++){
            if(t[i]=='0')   cnt++;
            else    break;
        }

        if(sz-cnt>=3)
        ans=min(ans,te+cnt);
    }
    if(ans==1e9+9)  printf("-1\n");
    else printf("%d\n",ans);

    return 0;
}