链接:​​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


 

分析:

只要末尾为00 25 50 75 就行

接下来枚举构造就行

注意:

交换后首字母不能为0

#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
#define N 100000+5
#define rep(i,n) for(int i=0;i<n;i++)
#define sd(n) scanf("%d",&n)

#define pd(n) scanf("%d\n",n)

#define MAX 26
typedef long long ll;
const ll mod=1e9+7;
ll n,m;
string s;
int flag2=0;
ll f(char x,char y,int n,string s1)
{
ll t;
ll pos=-1;
int flag1=0;
//cout<<x<<" "<<y<<endl;
for(int i=n-1;i>=0;i--)
{
if(s1[i]==y)
{
t=(n-i-1);
//cout<<t<<endl;
pos=i;
flag1=1;
break;
}
}
if(flag1==1)
for(int i=pos;i<n-1;i++)
{
swap(s1[i],s1[i+1]);
}
//cout<<pos<<" "<<s1<<endl;
if(flag1==0) return 1e18;
int vis=0;

for(int i=n-2;i>=0;i--)
{
if(s1[i]==x)
{
t+=(n-1-i-1);//cout<<t<<endl;
flag2=1;
pos=i;
vis=1;
break;
}
}
if(flag2==0||vis==0) return 1e18;
for(int i=pos;i<n-2;i++)
{
swap(s1[i],s1[i+1]);
}
//cout<<t<<" "<<s1<<endl;
if(s1[0]=='0')
{
// cout<<22<<endl;
for(int i=1;i<n-2;i++)
{
if(s1[i]!='0')
{
t+=i;
break;
}
}
}
return t;
}
int main()
{


while(cin>>s)
{
flag2=0;
ll len=s.length();
ll a=f('0','0',len,s);
ll b=f('2','5',len,s);
ll c=f('5','0',len,s);
ll d=f('7','5',len,s);
//cout<<a<<b<<" "<<c<<d<<endl;
if(flag2==1)
cout<<min(min(min(a,b),c),d)<<endl;
else
cout<<-1<<endl;
}

return 0;
}