题目链接:点击打开链接
题目大意:给出一个最多18位的十进制数字,且这个数字没有前导零。
可以通过交换相邻的两个数字,记为一次操作。
问经过多少次操作后,那个数字能被25整除。且这个数字没有前导零。
题目思路:
首先我们来思考,一个能被25整除的数的特点,那就是他的末两位能被25整除,即末两位只有四种情况:00,25,50,75
所以我们对这四种情况分开讨论,首先判断是否存在这种情况,即是否包含每对中的两个数字。
然后我们记录这两个数字的位置他们分别到len-1和len-2位置需要多少步操作,同时记录他是否是反着的,如果反着的话最后还要再加上1.
一开始我以为到此就结束了,忘记了考虑前导零,让我白白WA了好几次。
接下来,我们对数字长度大于2且我们需要移动第一位数字到末两位的情况,(思考一下我们要有这个前提,我们是不是只有在这种情况下才导致最后结果出现前导零),然后我们从左往右找第一位不是要移动到末两位的非零数的位置。然后计算一下将他移动到第一位的操作数即可。
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-10;
const int maxn=1000+100;
char s[maxn];
int a[maxn];
int main()
{
while(~scanf("%s",s))
{
int len=strlen(s);
memset(a,0,sizeof a);
for(int i=0;i<len;i++)
{
a[s[i]-'0']++;
}
int mine=0x3f3f3f3f;
int pos1,pos2;
int step;
if(a[0]>=2)//00
{
for(int i=len-1;i>=0;i--)
{
if(s[i]=='0')
{
pos1=i;
break;
}
}
for(int i=pos1-1;i>=0;i--)
{
if(s[i]=='0')
{
pos2=i;
break;
}
}
mine=min(mine,len-1-pos1+len-2-pos2);
}
if(a[2]>=1&&a[5]>=1)//25
{
int fan=0;
for(int i=len-1;i>=0;i--)
{
if(s[i]=='2')
{
fan=1;//反了
pos1=i;
break;
}
else if(s[i]=='5')
{
fan=0;//没反
pos1=i;
break;
}
}
for(int i=pos1-1;i>=0;i--)
{
if(s[i]=='2'&&fan==0)
{
pos2=i;
break;
}
else if(s[i]=='5'&&fan==1)
{
pos2=i;
break;
}
}
if(fan)step=len-1-pos1+len-2-pos2+1;
else step=len-1-pos1+len-2-pos2;
int pos=-1;
if(pos2==0&&len>2)
{
for(int i=0;i<len;i++)
{
if(s[i]!='0'&&pos1!=i&&pos2!=i)
{
pos=i;
break;
}
}
if(pos==-1)
{
step=0x3f3f3f3f;
}
else if(pos>=0&&pos<pos1)
{
step+=pos-1;
}
else
{
step+=pos-2;
}
}
mine=min(mine,step);
}
if(a[0]>=1&&a[5]>=1)//50
{
int fan=0;
for(int i=len-1;i>=0;i--)
{
if(s[i]=='5')
{
fan=1;//反了
pos1=i;
break;
}
else if(s[i]=='0')
{
fan=0;//没反
pos1=i;
break;
}
}
for(int i=pos1-1;i>=0;i--)
{
if(s[i]=='5'&&fan==0)
{
pos2=i;
break;
}
else if(s[i]=='0'&&fan==1)
{
pos2=i;
break;
}
}
if(fan)step=len-1-pos1+len-2-pos2+1;
else step=len-1-pos1+len-2-pos2;
int pos=-1;
if(pos2==0&&len>2)
{
for(int i=0;i<len;i++)
{
if(s[i]!='0'&&pos1!=i&&pos2!=i)
{
pos=i;
break;
}
}
if(pos==-1)
{
step=0x3f3f3f3f;
}
else if(pos>=0&&pos<pos1)
{
step+=pos-1;
}
else
{
step+=pos-2;
}
}
mine=min(mine,step);
}
if(a[7]>=1&&a[5]>=1)//75
{
int fan=0;
for(int i=len-1;i>=0;i--)
{
if(s[i]=='7')
{
fan=1;//反了
pos1=i;
break;
}
else if(s[i]=='5')
{
fan=0;//没反
pos1=i;
break;
}
}
for(int i=pos1-1;i>=0;i--)
{
if(s[i]=='7'&&fan==0)
{
pos2=i;
break;
}
else if(s[i]=='5'&&fan==1)
{
pos2=i;
break;
}
}
if(fan)step=len-1-pos1+len-2-pos2+1;
else step=len-1-pos1+len-2-pos2;
int pos=-1;
if(pos2==0&&len>2)
{
for(int i=0;i<len;i++)
{
if(s[i]!='0'&&pos1!=i&&pos2!=i)
{
pos=i;
break;
}
}
if(pos==-1)
{
step=0x3f3f3f3f;
}
else if(pos>=0&&pos<pos1)
{
step+=pos-1;
}
else
{
step+=pos-2;
}
}
mine=min(mine,step);
}
if(mine!=0x3f3f3f3f)printf("%d\n",mine);
else printf("-1\n");
}
return 0;
}