import java.lang.Math

fun main(args: Array<String>) {
    // drkenさんの解説を見て書く
    // http://drken1215.hatenablog.com/entry/2020/01/19/025500
    val INF = 1 shl 29
    val N = readInputLine().toInt()
    val AArr = readInputLine().split(" ").map { it.toInt() }.toIntArray()
    val BArr = readInputLine().split(" ").map { it.toInt() }.toIntArray()

    // ビットが立っているカードを使用してソート済みの際に、ソート済み範囲最も右側の数値を指定した際の操作数
    val dp = Array(1 shl N) { IntArray(51) { INF } }
    dp[0][0] = 0
    for (bit in 0 until (1 shl N)) {
        // 使用したカードの総数
        var used = 0
        for (i in 0 until N) {
            if (bit and (1 shl i) != 0) {
                used++
            }
        }

        // 使用していないカードを、ソート済み範囲の外に配置した際の(元の位置, 移動後位置)のリスト
        // ソート済み範囲外はソートする必要はない
        val unusedPoints = mutableListOf<Pair<Int, Int>>()
        var iter = used
        for (i in 0 until N) {
            if (bit and (1 shl i) == 0) {
                unusedPoints.add(Pair(i, iter))
                iter++
            }
        }

        // bitで表される使用カード状態に、新たに1枚カードを加える際のDP配る操作
        for (s in 0..50) {
            if (dp[bit][s] >= INF) {
                // 最も右側のカード数値を表せる操作がないときは配らない
                continue
            }
            for (p in unusedPoints) {
                val next = if (Math.abs(p.first - used) % 2 == 0) AArr[p.first] else BArr[p.first]
                if (next >= s) {
                    // next < sの場合は広義単調増加を満たせないのでスキップ
                    dp[bit or (1 shl p.first)][next] =
                        Math.min(dp[bit or (1 shl p.first)][next],
                                 dp[bit][s] + Math.abs(p.second - used))
                }
            }
        }
    }

    val ans = dp[(1 shl N) - 1].min()!!
    println(if (ans < INF) ans else -1)
}

fun readInputLine(): String {
    return readLine()!!
}
