版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingongzi/article/details/84729289
链接:https://ac.nowcoder.com/acm/contest/301/J
来源:牛客网
题目描述
小乐乐特别喜欢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就是5的倍数,先找出每个数字所在的位置,再逐个判断最小交换次数。
代码如下:
#include<stdio.h>
#include<string.h>
int min1(int a,int b)
{
if(a>b)
return b;
else
return a;
}
int main()
{
char s[20];
int len,p0,p00,p2,p5,p7,i,j,d,min;
while(scanf("%s",s)!=EOF)
{
len=strlen(s);
p0=p00=p2=p5=p7=-1;
min=0x3f3f3f3f;
for(i=0;i<=len-1;i++)
{
if(s[i]=='0')
{
p0=p00;
p00=i;
}
if(s[i]=='2')
p2=i;
if(s[i]=='5')
p5=i;
if(s[i]=='7')
p7=i;
}
len=len-1;
if(p7>=0&&p5>=0)
{
if(p7<p5)
min=min1(min,len-1-p7+len-p5);
else
min=min1(min,len-p7+len-p5);
}
if(p5>=0&&p00>=0)
{
if(p5<p00)
min=min1(min,len-1-p5+len-p00);
else
min=min1(min,len-p5+len-p00);
}
if(p2>=0&&p5>=0)
{
if(p2<p5)
min=min1(min,len-1-p2+len-p5);
else
min=min1(min,len-p2+len-p5);
}
if(p0>=0&&p00>=0)
{
if(p0<p00)
min=min1(min,len-1-p0+len-p00);
else
min=min1(min,len-p0+len-p00);
}
if(min==0x3f3f3f3f)
printf("-1\n");
else
printf("%d\n",min);
}
return 0;
}