1. 程式人生 > >哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級) J 小樂樂和25 【分類】

哈爾濱理工大學軟體與微電子學院第八屆程式設計競賽同步賽(高年級) J 小樂樂和25 【分類】

題目描述 

小樂樂特別喜歡25這個數字,他想把所有的數字都變成25的倍數。
現在小樂樂得到一個數字,想問問你最少用幾次操作才可以把這個數字改造成25的倍數。
對於一次操作我們可以把相鄰的兩位做交換,比如123經過一次操作之後就可以變成213或者132。  

輸入描述:

多組資料輸入

對於每組資料,只有一行輸入一個整數n(1 <= n <= 1000000000)。

輸出描述:

如果經過最少x次操作後,這個數就變成了25的倍數,那麼輸出x;

如果這個數無論怎麼變化都變不成25的倍數,輸出-1.
   

解題思路:

寫出25的倍數

25、50、100、125、150、175、200、225、250、275、300....

其實最後交換得到的數能不能被 25 整除 關鍵在於 最後兩位 是不是 00、 25、 50、 75

因為百位以上可以被 100 整除,所以判斷 最後兩位即可,分四類討論一下,判斷那種交換方式操作次數最小。

 

AC  code:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <algorithm>
 5
#include <cmath> 6 #include <map> 7 #define INF 0x3f3f3f3f 8 #define LL long long 9 using namespace std; 10 const int MAXN = 100; 11 char num[MAXN]; 12 int len; 13 14 int cou(int v1, int v2) 15 { 16 if(v1==len-1) return len-1-v2; 17 else if(v2<v1) return len-2-v1-1+len-1
-v2; 18 else if(v1<v2) return len-2-v1+len-1-v2; 19 return 100; 20 } 21 22 int main() 23 { 24 while(~scanf("%s", num)){ 25 len = strlen(num); 26 int zo1 = -1, zo2 = -1, sev = -1, two = -1, five = -1; 27 for(int i = len-1; i >= 0; i--){ 28 if(num[i] == '0'){ 29 if(zo2 != -1) continue; 30 if(zo1 == -1) zo1 = i; 31 else zo2 = i; 32 } 33 34 if(num[i] == '2'){ 35 if(two == -1) two = i; 36 } 37 38 if(num[i] == '5'){ 39 if(five == -1) five = i; 40 } 41 42 if(num[i] == '7'){ 43 if(sev == -1) sev = i; 44 } 45 } 46 int ans = 101; 47 if(zo1 != -1 && zo2 != -1) ans = min(ans, cou(zo2, zo1)); //00 48 if(two != -1 && five != -1) ans = min(ans, cou(two, five)); //25 49 if(five != -1 && zo1 != -1) ans = min(ans, cou(five, zo1)); //50 50 if(sev != -1 && five != -1) ans = min(ans, cou(sev, five)); //75 51 52 if(ans == 101) puts("-1"); 53 else printf("%d\n", ans); 54 } 55 return 0; 56 57 }