#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

#define sf scanf
#define pf printf
#define pb push_back
#define mp make_pair
#define PI ( acos(-1.0) )
#define mod 998244353LL
#define IN freopen("C.in","r",stdin)
#define OUT freopen("output.txt","w",stdout)
#define FOR(i,a,b) for(i=a ; i<=b ; i++)
#define DBG pf("Hi\n")
#define INF 1000000000
#define i64 long long int
#define eps (1e-8)
#define xx first
#define yy second
#define ln 17
#define off 2

using namespace __gnu_pbds;
using namespace std ;

typedef tree< i64, null_type, less<i64>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
typedef pair<i64, i64> pii;

#define maxn 1000005
const int N = 1000000 ;

i64 a[maxn] , b[maxn] ;
i64 dp1[maxn] , dp2[maxn] ;
i64 p[35] ;

int howMuch(i64 x , i64 y)
{
    int ans= 0 ;
    while( x>y )
    {
        y *= 4LL ;
        ans++ ;
    }
    return ans ;
}

void func( int n , i64 *a , i64 *dp )
{
    dp[n] = 0 ;
    stack<int> st ;
    for(int i=1 ; i<=n ; i++) b[i] = a[i] ;
    for(int i=n-1 ; i>=1 ; i--)
    {
        dp[i] = dp[i+1] ;
        if( b[i] <= b[i+1] )
        {
            if( b[i]*4LL <= b[i+1] ) st.push(i) ;
            continue ;
        }
        int c = howMuch(b[i],b[i+1]) ;
        for(int j=i+1; j<=n ; j++)
        {
            dp[i] += c ; b[j] *= p[c] ;
            if( st.empty() )
            {
                dp[i] += (n-j)*c ;
                break ;
            }
            if( st.top() == j )
            {
                c = howMuch(b[j],b[j+1]) ;
                if( c==0 )
                {
                    break ;
                }
                else st.pop() ;
            }
        }
    }
    for(int i=1 ; i<=n ; i++) b[i] = a[i] ;
    i64 lastCnt = 0LL , ans = 0LL ;
    for(int i=2 ; i<=n ; i++)
    {
        if( b[i-1] <= b[i] )
        {
            while( lastCnt !=0 && b[i-1] <= b[i] )
            {
                lastCnt-- ;
                b[i-1] *= 4LL ;
            }
        }
        lastCnt += howMuch( b[i-1],b[i] ) ;
        ans += lastCnt ;
    }
  //  printf("%lld\n",ans*2) ;
    if( ans != dp[1] )
    {
      //  DBG ;
     //   int x = 1/0 ;
     while(1){}
    }
    return ;
}

i64 calc(int i , int n)
{
    int j = i ;
    for( ; i<=n ; i++) b[i] = a[i] ;
    i64 lastCnt = 0LL , ans = 0LL ;
    i = j+1 ;
    for( ; i<=n ; i++)
    {
        while( lastCnt !=0 && b[i-1] <= b[i] )
        {
            lastCnt-- ;
            b[i-1] *= 4LL ;
        }
        lastCnt += howMuch( b[i-1],b[i] ) ;
        ans += lastCnt ;
    }
  //  printf("%lld\n",ans) ;
    return ans ;
}

int main()
{
    int i , j , k , l , m , n ;

    p[0] = 1LL ;
    for(i=1 ; i<=30 ; i++) p[i] = p[i-1]*4LL ;

    scanf("%d",&n) ;
    for(i=1 ;i<=n ; i++)
    {
        scanf("%lld",&a[i]) ;
    }
/*
    for(i=1 ; i<=n ; i++) printf("%lld ", 2LL*calc(i,n)) ;
    printf("\n") ;
*/
    func(n,a,dp1) ;

    for(i=1 ; i<=n ; i++) dp1[i] *= 2LL ;

    for(i=1 ; i<=n ; i++) a[i] *= 2LL ;

    for(i=1,j=n ; i<j ; i++,j-- )
    {
        swap( a[i],a[j] ) ;
    }
    func( n , a , dp2 ) ;

    for( i=1,j=n ; i<j ; i++,j-- )
    {
        swap(dp2[i],dp2[j]) ;
    }
    for(i=1 ; i<=n ; i++) dp2[i] = dp2[i]*2+i ;
/*
    for(i=1 ; i<=n ; i++) printf("%d:%lld ",i,dp1[i]) ;
    printf("\n") ;

    for(i=1 ; i<=n ; i++) printf("%lld ", 2LL*calc(i,n)+1) ;
    printf("\n") ;

    for(i=1 ; i<=n ; i++) printf("%d:%lld ",i,dp2[i]) ;
    printf("\n") ;
*/

    i64 ans = min( dp1[1] , dp2[n] ) ;

    for(i=1 ; i<n ; i++) ans = min( ans , dp2[i]+dp1[i+1] ) ;

    printf("%lld\n",ans) ;

    return 0 ;
}
/*
10
2 3 100 5 35 5000 1 20 3 20
*/


Measured memory_bytes: 14080