#include <bits/stdc++.h>
static char s[1 << 20 | 1] = {0}, *p1 = s, *p2 = s;
inline char gc() {
  return (p1 == p2) && (p2 = (p1 = s) + fread(s, 1, 1 << 20, stdin), p1 == p2)
             ? EOF
             : *(p1++);
}
inline int read() {
  int ret = 0;
  bool flag = 0;
  char c = gc();
  while ((c < '0') | (c > '9')) flag ^= !(c ^ '-'), c = gc();
  while ((c >= '0') & (c <= '9'))
    ret = (ret << 1) + (ret << 3) + (c ^ '0'), c = gc();
  return flag ? -ret : ret;
}
const int MaxN = 111;
int Dp[2][MaxN][MaxN][2], A[MaxN];
int n, a, b, now, pre;
int main(void) {
  n = read();
  for (int i = 1; i <= n; ++i) {
    A[i] = read();
    if (!A[i]) {
      A[i] = -1;
      continue;
    }
    (A[i] &= 1) ? ++a : ++b;
  }
  a = ((n & 1) ? ((n >> 1) + 1) : (n >> 1)) - a, b = (n >> 1) - b;
  memset(Dp, 0x3f, sizeof Dp);
  if (!~A[1]) {
    if (a) Dp[0][a - 1][b][1] = 0;
    if (b) Dp[0][a][b - 1][0] = 0;
  } else
    Dp[0][a][b][A[1]] = 0;
  for (int i = 2; i <= n; ++i) {
    pre = now, now ^= 1;
    memset(Dp[now], 0x3f, sizeof Dp[now]);
    if (~A[i]) {
      for (int j = a; ~j; --j)
        for (int k = b; ~k; --k)
          Dp[now][j][k][A[i]] = std::min(Dp[pre][j][k][0] + (A[i] != 0),
                                         Dp[pre][j][k][1] + (A[i] != 1));
      continue;
    }
    for (int j = a; ~j; --j)
      for (int k = b; ~k; --k)
        Dp[now][j][k][0] =
            std::min(Dp[pre][j][k + 1][0], Dp[pre][j][k + 1][1] + 1),
        Dp[now][j][k][1] =
            std::min(Dp[pre][j + 1][k][0] + 1, Dp[pre][j + 1][k][1]);
  }
  printf("%d\n", std::min(Dp[now][0][0][0], Dp[now][0][0][1]));
  return 0;
}
