#include <bits/stdc++.h>
using namespace std;
template <typename T>
struct BIT{
    //区間加算O(log(N))
    //区間シグマ計算O(log(N))
    //単点加算O(log(N))
    //単点計算O(log(N))
    long long n;//元の数列のサイズ
    vector<T> bit[2];//データ収納用
    vector<T> for_bubblesort;
    void init(long long n_){
        n=n_+1;
        for(long long j=0;j<2;j++){
            bit[j].assign(n,0);
        }
    }
    void add_sub(long long p,long long i,T x){
        for(long long j=i;j<n;j+=j&-j){
            bit[p][j]+=x;
        }
    }
    void add(long long l,long long r,T x){//[l,r]に加算
        add_sub(0,l,-x*(l-1));
        add_sub(0,r+1,x*r);
        add_sub(1,l,x);
        add_sub(1,r+1,-x);
    }
    T sum_sub(long long p,long long i){
        T s(0);
        for (long long j=i;j>0;j-=j&-j){
            s+=bit[p][j];
        }
        return s;
    }
    T sum(long long i,long long j){//[i,j]のΣを計算
        return sum_sub(0,j)+sum_sub(1,j)*j-sum_sub(0,i-1)-sum_sub(1,i-1)*(i-1);
    }
    //ここから二分探索関連
    T binary_search_sum1(long long key){//a_1+a_2+...+a_x>=keyとなるような最小のxを求める(ただしa_i>=0)
    //key以上の値
            if(key<=0){
                return 0;
            }
            else{
                long long x=0,r=1;
                while(r<n){
                    r=r<<1;
                }
                for(long long length=r;length>0;length=length>>1){//長さlenは1段下るごとに半分に
                    if(x+length<n&&sum(x+1,x+length)<key){//採用するとき
                        key-=sum(x+1,x+length);
                        x+=length;
                    }
                }
                return x+1;
            }
    }
    T binary_search_sum2(long long key){//a_1+a_2+...+a_x<=keyとなるような最大のxを求める(ただしa_i>=0)
    //key以下の値
            key++;
            if(key<=0){
                return 0;
            }
            else{
                long long x=0,r=1;
                while(r<n){
                    r=r<<1;
                }
                for(long long length=r;length>0;length=length>>1){//長さlenは1段下るごとに半分に
                    if(x+length<n&&sum(x+1,x+length)<key){//採用するとき
                        key-=sum(x+1,x+length);
                        x+=length;
                    }
                }
                return x;
            }
    }
    //二分探索終わり
    //ここからはbubblesort関連
    void init_bubblesort(long long n_){
        n=n_+1;
        for_bubblesort.assign(n,0);
    }
    void add_bubblesort(long long i,T x) {
        for(long long j=i;j<n;j+=j&-j){
            for_bubblesort[j]+=x;
        }
    }
    T calculate_bubblesort(long long i) {
        T s=0;
        for(long long j=i;j>0;j-=j&-j){
            s+=for_bubblesort[j];
        }
        for(long long j=i-1;j>0;j-=j&-j){
            s-=for_bubblesort[j];
        }
        return s;
    }
    T bubblesort(){
        //bitとfor_bubblesort両方initしてadd_for_bubblesortしてから使う
        long long answer_for_bubblesort=0;
        long long sum_for_bubblesort;
        for(long long i=1;i<=n-1;i++){
            sum_for_bubblesort=calculate_bubblesort(i);
            answer_for_bubblesort+=i-sum(1,sum_for_bubblesort)-1;
            add(sum_for_bubblesort,sum_for_bubblesort,1);
        }
        return answer_for_bubblesort;
    }
    //bubblesort関連終わり
    /*
    使い方
    BIT<long long> rock;
    rock.init(N);    Nは加算などの操作を行う配列のサイズ
    ...(その後は適当に)
    */
};
int main(){
  #define int long long
  int N;
  cin>>N;
  vector<int> A(N);
  for(int i=0;i<N;i++){
    cin>>A.at(i);
    A.at(i)-=i+1;
  }
  sort(A.begin(),A.end());
  BIT<int> rock;
  rock.init(N);
  for(int i=0;i<N;i++){
    rock.add(i+1,i+1,A.at(i));
  }
  int ans;
  for(int i=1;i<=N;i++){
    if(rock.sum(i,i)==0){}
    else{
      int p=rock.sum(i,i);
      rock.add(1,N,-p);
    }
    int S=0;
    if(i==1){S=rock.sum(1,N);}
    else if(i==N){S=-1*rock.sum(1,N);}
    else{S=-1*rock.sum(1,i)+rock.sum(i,N);}
    //cout<<S<<endl;
    if(i==1)ans=S;
    if(i>1)ans=min(S,ans);
  }
  cout<<ans<<endl;
}

Measured memory_bytes: 7956