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

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

小樂樂和25

連結:https://ac.nowcoder.com/acm/contest/301/J
來源:牛客網

題目描述

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

輸入描述:

多組資料輸入

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

輸出描述:

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


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

輸入

2018

輸出

-1
示例2

輸入

2020

輸出

1

說明

經過一次之後變成2200
 1 #include<iostream>
 2
#include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define inf 0x3f3f3f3f 6 using namespace std; 7 typedef long long ll; 8 int n; 9 int pos00,pos01,pos2,pos5,pos7; 10 int flag; 11 int main() 12 { 13 while(~scanf("%d",&n)) 14 { 15 pos00=-1,pos01=-1,pos2=-1
,pos5=-1,pos7=-1; 16 int now=1; 17 while(n)//找到第一個存在的0,第二個存在的0,第一個存在的2,5,7的具體位置。 18 { 19 int tmp=n%10; 20 if(tmp==0&&pos00==-1) 21 { 22 pos00=now; 23 } 24 else if(tmp==0&&pos01==-1) 25 { 26 pos01=now; 27 } 28 if(tmp==2&&pos2==-1) 29 { 30 pos2=now; 31 } 32 if(tmp==5&&pos5==-1) 33 { 34 pos5=now; 35 } 36 if(tmp==7&&pos7==-1) 37 { 38 pos7=now; 39 } 40 n/=10; 41 now++; 42 } 43 int minn=inf; 44 if(pos00!=-1&&pos01!=-1)//如果存在兩個0 45 { 46 if(pos00==1)//第一個0的位置是0,那麼只用移動第二個0的位置到第二位 47 minn=min(minn,pos01-2); 48 else 49 minn=min(minn,pos00-1+pos01-2); 50 } 51 if(pos00!=-1&&pos5!=-1) 52 { 53 if(pos5>pos00)//如果5在0後面,那麼不影響,直接把0移動到最後一位,把5移動到倒數第二位 54 { 55 minn=min(minn,pos00-1+pos5-2); 56 } 57 else//如果0在5前面,那麼如果把5移動到倒數第二位就停止了的話,0移動到最後一位會對5的位置有影響,所以我們應該把5移動到最後一位,然後0之後也移動到最後一位,那麼5和0交換就是答案 58 { 59 minn=min(minn,pos5-1+pos00-1); 60 } 61 } 62 if(pos2!=-1&&pos5!=-1) 63 { 64 if(pos2>pos5) 65 { 66 minn=min(minn,pos5-1+pos2-2); 67 } 68 else 69 { 70 minn=min(minn,pos2-1+pos5-1); 71 } 72 } 73 if(pos7!=-1&&pos5!=-1) 74 { 75 if(pos7>pos5) 76 { 77 minn=min(minn,pos5-1+pos7-2); 78 } 79 else 80 { 81 minn=min(minn,pos7-1+pos5-1); 82 } 83 } 84 if(minn==inf) 85 { 86 puts("-1"); 87 } 88 else 89 { 90 printf("%d\n",minn); 91 } 92 } 93 }