1. 程式人生 > >Codeforces Round 486 Div3(包含前五題題解)

Codeforces Round 486 Div3(包含前五題題解)

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

*/
最後一個題我就不寫了,時間有限,大家見諒