思路:
已知25的倍数末尾一定是00、25、50、75,且末尾为以上值的一定是25的倍数。那么就可以分别判断四种情况,取最优。
判断时直接找到距离末尾最近的目标值,然后直接交换过来即可。需要注意前导零,如果交换过程中出现前导零,那么我们可以在交换前用靠前的并且不是目标值的非零数移到前面,这样就不会有前导零了,为了简便,我们可以在最后判断一下有多少前导零,就是需要额为走的步数。
-1的情况可以预先判断一下。
代码:
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<queue> #include<map> using namespace std; #define inf 0x3f3f3f3f #define MAXN 200005 #define ll long long ll n; int len,a[20],b[20]; int vis[10]; int main() { scanf("%lld",&n); memset(vis,0,sizeof vis); while(n) { a[len++]=n%10; vis[n%10]++; n/=10; } int ans=inf; if(!(vis[0]>=2 || (vis[0] && vis[5]) || (vis[2] && vis[5]) || (vis[7] && vis[5]))) printf("-1\n"); else { if(vis[0]>=2) { int tmp,s=0; memcpy(b,a,sizeof a); for(int i=0;i<len;i++) { if(b[i]==0) { tmp=i; break; } } for(int i=tmp;i>0;i--) { swap(b[i],b[i-1]); s++; } for(int i=1;i<len;i++) { if(b[i]==0) { tmp=i; break; } } for(int i=tmp;i>1;i--) { swap(b[i],b[i-1]); s++; } for(int i=len-1;i>=0;i--) { if(b[i]) break; s++; } ans=min(ans,s); } if(vis[2] && vis[5]) { memcpy(b,a,sizeof a); int tmp,s=0; for(int i=0;i<len;i++) { if(b[i]==5) { tmp=i; break; } } for(int i=tmp;i>0;i--) { swap(b[i],b[i-1]); s++; } for(int i=1;i<len;i++) { if(b[i]==2) { tmp=i; break; } } for(int i=tmp;i>1;i--) { swap(b[i],b[i-1]); s++; } for(int i=len-1;i>=0;i--) { if(b[i]) break; s++; } ans=min(ans,s); } if(vis[5] && vis[0]) { int tmp,s=0; memcpy(b,a,sizeof a); for(int i=0;i<len;i++) { if(b[i]==0) { tmp=i; break; } } for(int i=tmp;i>0;i--) { swap(b[i],b[i-1]); s++; } for(int i=1;i<len;i++) { if(b[i]==5) { tmp=i; break; } } for(int i=tmp;i>1;i--) { swap(b[i],b[i-1]); s++; } for(int i=len-1;i>=0;i--) { if(b[i]) break; s++; } ans=min(ans,s); } if(vis[7] && vis[5]) { int tmp,s=0; memcpy(b,a,sizeof a); for(int i=0;i<len;i++) { if(b[i]==5) { tmp=i; break; } } for(int i=tmp;i>0;i--) { swap(b[i],b[i-1]); s++; } for(int i=1;i<len;i++) { if(b[i]==7) { tmp=i; break; } } for(int i=tmp;i>1;i--) { swap(b[i],b[i-1]); s++; } for(int i=len-1;i>=0;i--) { if(b[i]) break; s++; } ans=min(ans,s); } printf("%d\n",ans); } return 0; }