//列にあるブロックの数を単純に趣味レートする(ただし、ブロックは常に左詰めにする)
#include<iostream>
using namespace std;
#define DB(x) 

int N,b[10102];
int ans[20],cor = 0;

int main(){
	int i;
	while(cin >> N){
		if(N == 0)
			break;
		for(i = 0;i < 10102;i++)
			b[i] = 0;
		for(i = 0;i < N;i++)
			cin >> b[i];
		//シュミレーション
		int wide = N;			//ブロックが何列積まれているか
		while(ans[cor] <= 10000){
			for(i = 0;i < wide;i++){
				if(b[i] != i+1)
					break;
			}
			if(i == wide)
				break;
			//一番下段を抜く(抜いた数をカウント)
			int count = 0;
			for(i = 0;i < wide;i++){
				if(b[i] > 0){
					b[i]--;
					count++;
				}
			}
			//一番右の列よりもう一個右にブロックを移動
			b[wide] = count;
			//空白の数を数えながら各列O(1)でシフトする。
			int emp = 0;
			for(i = 0;i <= wide;i++){
				if(b[i] > 0)
					b[i-emp] = b[i];
				else
					emp++;
			}
			wide -= emp-1;	//-1が重要！
			ans[cor]++;
			DB(for(i = 0;i <= wide;i++)cout << b[i] << " ";cout << endl;)
		}
		DB(for(i = 0;i <= wide;i++)cout << b[i] << " ";cout << endl;)
		if(ans[cor] > 10000)
			ans[cor] = -1;
		cor++;
	}
	for(i = 0;i < cor;i++)
		cout << ans[i] << endl;
	return 0;
}