哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)(J) 小乐乐和25

小乐乐和25

链接: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
 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 }

猜你喜欢

转载自www.cnblogs.com/1013star/p/10054042.html