哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級)(J) 小樂樂和25
阿新 • • 發佈:2018-12-02
小樂樂和25
連結:https://ac.nowcoder.com/acm/contest/301/J
來源:牛客網
題目描述
小樂樂特別喜歡25這個數字,他想把所有的數字都變成25的倍數。現在小樂樂得到一個數字,想問問你最少用幾次操作才可以把這個數字改造成25的倍數。
對於一次操作我們可以把相鄰的兩位做交換,比如123經過一次操作之後就可以變成213或者132。
輸入描述:
多組資料輸入
對於每組資料,只有一行輸入一個整數n(1 <= n <= 1000000000)。
輸出描述:
如果經過最少x次操作後,這個數就變成了25的倍數,那麼輸出x;示例1
如果這個數無論怎麼變化都變不成25的倍數,輸出-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 }