链接:https://ac.nowcoder.com/acm/contest/301/J
来源:牛客网
题目描述
小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成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 }