1. 程式人生 > >牛客 小樂樂和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.


思博題


先來分析一下如何出現25的倍數。 顯然25的倍數要求數字的最後兩位是(25,50,75,00)這四種情況中的一種。
分別記錄一下 2 5 7 0 最先出現的位置,不過這裡要記錄兩個0的位置,然後再儲存最小值就可以了
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int f(int e, int w){
 6     if(w==-1||e==-1)
 7         return 0x3f3f3f3f;
 8     if(w > e){
9 return w+e; 10 } else return w+e-1; 11 } 12 int main(){ 13 int n; 14 while(scanf("%d",&n)!=EOF){ 15 int zero1=-1, zero2=-1; 16 int two = -1, five=-1; 17 int seven=-1; 18 int len = 0; 19 while(n){ 20 switch(n%10){ 21 case
0: 22 if(zero1==-1) 23 zero1 = len; 24 else if(zero2==-1) 25 zero2 = len; 26 break; 27 case 2: 28 if(two==-1) 29 two = len; 30 break; 31 case 5: 32 if(five==-1) 33 five = len; 34 break; 35 case 7: 36 if(seven==-1) 37 seven = len; 38 break; 39 default: 40 break; 41 } 42 n/=10; 43 len ++; 44 } 45 int ans = 0x3f3f3f3f; 46 47 ans = min(ans,f(two,five)); 48 ans = min(ans,f(five,zero1)); 49 ans = min(ans,f(seven,five)); 50 ans = min(ans,f(zero2,zero1)); 51 52 if(ans == 0x3f3f3f3f) 53 printf("-1\n"); 54 else 55 printf("%d\n",ans); 56 } 57 return 0; 58 }
View Code