哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)(J) 小乐乐和25
小乐乐和25
链接:https://ac.nowcoder.com/acm/contest/301/J
来源:牛客网
题目描述
小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。
输入描述:
多组数据输入
对于每组数据,只有一行输入一个整数n(1 <= n <= 1000000000)。
输出描述:
如果经过最少x次操作后,这个数就变成了25的倍数,那么输出x;
如果这个数无论怎么变化都变不成25的倍数,输出-1.
示例1
输入
2018
输出
-1
示例2
输入
2020
输出
1
说明
经过一次之后变成2200
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #define inf 0x3f3f3f3f
6 using namespace std;
7 typedef long long ll;
8 int n;
9 int pos00,pos01,pos2,pos5,pos7;
10 int flag;
11 int main()
12 {
13 while(~scanf("%d",&n))
14 {
15 pos00=-1,pos01=-1,pos2=-1,pos5=-1,pos7=-1;
16 int now=1;
17 while(n)//找到第一个存在的0,第二个存在的0,第一个存在的2,5,7的具体位置。
18 {
19 int tmp=n%10;
20 if(tmp==0&&pos00==-1)
21 {
22 pos00=now;
23 }
24 else if(tmp==0&&pos01==-1)
25 {
26 pos01=now;
27 }
28 if(tmp==2&&pos2==-1)
29 {
30 pos2=now;
31 }
32 if(tmp==5&&pos5==-1)
33 {
34 pos5=now;
35 }
36 if(tmp==7&&pos7==-1)
37 {
38 pos7=now;
39 }
40 n/=10;
41 now++;
42 }
43 int minn=inf;
44 if(pos00!=-1&&pos01!=-1)//如果存在两个0
45 {
46 if(pos00==1)//第一个0的位置是0,那么只用移动第二个0的位置到第二位
47 minn=min(minn,pos01-2);
48 else
49 minn=min(minn,pos00-1+pos01-2);
50 }
51 if(pos00!=-1&&pos5!=-1)
52 {
53 if(pos5>pos00)//如果5在0后面,那么不影响,直接把0移动到最后一位,把5移动到倒数第二位
54 {
55 minn=min(minn,pos00-1+pos5-2);
56 }
57 else//如果0在5前面,那么如果把5移动到倒数第二位就停止了的话,0移动到最后一位会对5的位置有影响,所以我们应该把5移动到最后一位,然后0之后也移动到最后一位,那么5和0交换就是答案
58 {
59 minn=min(minn,pos5-1+pos00-1);
60 }
61 }
62 if(pos2!=-1&&pos5!=-1)
63 {
64 if(pos2>pos5)
65 {
66 minn=min(minn,pos5-1+pos2-2);
67 }
68 else
69 {
70 minn=min(minn,pos2-1+pos5-1);
71 }
72 }
73 if(pos7!=-1&&pos5!=-1)
74 {
75 if(pos7>pos5)
76 {
77 minn=min(minn,pos5-1+pos7-2);
78 }
79 else
80 {
81 minn=min(minn,pos7-1+pos5-1);
82 }
83 }
84 if(minn==inf)
85 {
86 puts("-1");
87 }
88 else
89 {
90 printf("%d\n",minn);
91 }
92 }
93 }