Codeforces Round 486 Div3(包含前五題題解)
阿新 • • 發佈:2018-12-23
Note
In the first example one of the possible sequences of moves is 5071 →→ 5701 →→ 7501 →→ 7510 →→ 7150.
E題一開始我一看,覺得好簡單,然後瞬間就有思路了,但是沒想到有太多的問題要考慮。
最後一個題我就不寫了,時間有限,大家見諒#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; ll n; vector<int> judge[14]; int main() { scanf("%I64d",&n); if( n%25 == 0 ) { printf("0\n"); return 0; } ll t = n; int p[30]; int cnt = 0; while( t ) { p[++cnt] = t%10; t = t/10; } int ans = inf; if( cnt == 2 ) { int a = n/10,b = n%10; if( b != 0 && (b*10+a)%25 == 0 ) ans = 1; goto there; } for( int i = 1 ; i <= cnt ; i++ ) { if( i == cnt ) { if( p[i-1] == 0 ) { if( p[i] == 5 ) //5 0 的情況,找找一個數替換0 { int j = i-1; while( p[j] == 0 && j >= 1 ) j--; if( j >= 1 ) { if( judge[0][0] > j ) ans = min(ans,i-1-j+i+judge[0][0]-4); //5 0 else ans = min(ans,i-1-j+i+judge[0][0]-3); if( p[j] != 2 && p[j] != 7 ) { if( judge[2].size() ) ans = min(ans,i-1-j+i+judge[2][0]-2); if( judge[7].size() ) ans = min(ans,i-1-j+i+judge[7][0]-2); } else if( p[j] == 2 ) { if( judge[2].size()+judge[7].size() <= 1 ) { int k = j-1; while( p[k] == 0 && k >= 1 ) k--; if( k >= 1 ) { ans = min(ans,i-1-k+i+judge[2][0]-3);//500024 } } else if( judge[2].size() >= 2 ) ans = min(ans,i-1-j+i+judge[2][0]-2); //5024642 if( judge[7].size() ) ans = min(ans,i-1-j+i+judge[7][0]-2); // 502467 } else if( p[j] == 7 ) { if( judge[7].size() == 1 && judge[2].size() == 0 ) { int k = j-1; while( p[k] == 0 && k >= 1 ) k--; if( k >= 1 ) ans = min(ans,i-1-k+i+judge[7][0]-3); //50074 } else if( judge[7].size() >= 2 ) ans = min(ans,i-1-j+i+judge[7][0]-2); //50774 if( judge[2].size() ) ans = min(ans,i-1-j+i+judge[2][0]-2); //507442 } } } if( p[i] == 2 || p[i] == 7 ) { int j = i-1; while( p[j] == 0 && j >= 1 ) j--; if( j >= 1 ) { if( p[j] != 5 ) { if( judge[5].size() ) ans = min(ans,i-1-j+i+judge[5][0]-3); } else { if( judge[5].size() == 1 ) { int k = j-1; while( p[k] == 0 && k >= 1 ) k--; if( k >= 1 ) { ans = min(ans,i-1-k+i+judge[5][0]-4); } } else ans = min(ans,i-1-j+i+judge[5][0]-3); } } } } else { if( p[i] == 2 || p[i] == 7 ) { if( judge[5].size() ) ans = min(ans,i+judge[5][0]-3); } else if( p[i] == 5 ) { if( judge[0].size() ) ans = min(ans,i+judge[0][0]-3); if( judge[2].size() ) ans = min(ans,i+judge[2][0]-2); if( judge[7].size() ) ans = min(ans,i+judge[7][0]-2); } } break; } if( p[i] == 0 ) { judge[0].push_back(i); if( judge[0].size() == 2 ) ans = min( ans,judge[0][0]+i-3 ); if( judge[5].size() ) ans = min( ans,judge[5][0]+i-2); } else if( p[i] == 5 ) { judge[5].push_back(i); if( judge[2].size() ) ans = min(ans,judge[2][0]+i-2); if( judge[0].size() ) ans = min( ans,judge[0][0]+i-3); if( judge[7].size() ) ans = min( ans,judge[7][0]+i-2); } else if( p[i] == 2 ) { judge[2].push_back(i); if( judge[5].size() ) ans = min( ans,judge[5][0]+i-3); } else if( p[i] == 7 ) { judge[7].push_back(i); if( judge[5].size() ) ans = min( ans,judge[5][0]+i-3); } //if( ans == 2 ) // cout<<"asd"<<i<<endl; } there: if( ans == inf ) printf("-1\n"); else printf("%d\n",ans); return 0; } /* 500024 50030 50003 5003000 */