CF988E Solution
题解
可以发现结尾只得为\(00,25,50,75\),因此枚举这些数字将其放至结尾即可。若将\(n\)由右至左从\(1\)开始编号,将数字\(a_i\)移至末尾所需操作数为\(i-1\)。此外,若数对\(00,25,50,75\)的顺序是正确的,操作数须\(-1\);若存在前缀0,需要增加前缀0个数的操作数。设\(n\)数位数为\(d\),时间复杂度为\(O(d^3)\)。
AC代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=0x3f3f3f3f3f3f3f3f;
int a[20];
bool check(int i,int j)
{
return ((a[i]==7 && a[j]==5) || (a[i]==5 && !a[j]) || (!a[i] && !a[j]) || (a[i]==2 && a[j]==5));
}
signed main()
{
int n,cnt=0,ans=inf;
scanf("%lld",&n);
while(n) {a[++cnt]=n%10; n/=10;}
for(int i=1;i<=cnt;i++)
{
for(int j=i+1;j<=cnt;j++)
{
if(check(i,j) || check(j,i))
{
int tmp=i-1+j-1,ti=a[i],tj=a[j],pos=cnt,num=0;
tmp-=check(j,i);
a[i]=0,a[j]=0;//a[i],a[j]无法阻止前缀0的脚步
while(!a[pos] && pos)
{
if(pos!=i && pos!=j) num++;//但它们不在前缀0的队伍中
pos--;
}
tmp+=num; a[i]=ti,a[j]=tj;
ans=min(ans,tmp);
}
}
}
if(ans==inf) printf("-1");
else printf("%lld",ans);
return 0;
}