题目描述
小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。
输入描述:
多组数据输入
对于每组数据,只有一行输入一个整数n(1 <= n <= 1000000000)。
输出描述:
如果经过最少x次操作后,这个数就变成了25的倍数,那么输出x;
如果这个数无论怎么变化都变不成25的倍数,输出-1.
示例1
输入
2018
输出
-1
输入
2020
输出
1
说明
经过一次之后变成2200
题意
中文题意,不做解释。
分析
暴力枚举00,25,50,75,四种情况就好了。
看了一下大佬的代码,改进了一些,以前代码比较长。。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// author:Kissheart /// #include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<vector> #include<stdlib.h> #include<math.h> #include<queue> #include<deque> #include<ctype.h> #include<map> #include<set> #include<stack> #include<string> #define INF 0x3f3f3f3f #define FAST_IO ios::sync_with_stdio(false) const double PI = acos(-1.0); const double eps = 1e-6; const int MAX=1e5+10; const int mod=1e9+7; typedef long long ll; using namespace std; #define gcd(a,b) __gcd(a,b) inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;} inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;} inline ll inv1(ll b){return qpow(b,mod-2);} inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;} inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;} //freopen( "in.txt" , "r" , stdin ); //freopen( "data.txt" , "w" , stdout ); int a[15],cur; ll n,p; int getdist(int i,int j) { if(i>j) return i+j-3; return i+j-2; } int main() { while(~scanf("%lld",&n)) { cur=0; if(n%25==0) { printf("0 "); continue; } p=n; while(p) { a[++cur]=p%10; p/=10; } int ans=INF; for(int i=1;i<=cur;i++) { for(int j=i+1;j<=cur;j++) { if((a[i]*10+a[j])%25==0) ans=min(ans,getdist(i,j)); if((a[j]*10+a[i])%25==0) ans=min(ans,getdist(j,i)); } } if(ans==INF) printf("-1 "); else printf("%d ",ans); } return 0; }