牛客 小乐乐和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

猜你喜欢

转载自www.cnblogs.com/kongbb/p/10060683.html