题目描述
小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成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 ", ans); 54 } 55 return 0; 56 57 }