牛客 小樂樂和25
阿新 • • 發佈:2018-12-03
連結: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){View Code9 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 case0: 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 }