#include <bits/stdc++.h>
using namespace std;
long long mark[100005];
string s[100005];
string process(string s) {
  long long sz = s.size();
  long long i;
  stack<char> st;
  for (i = sz - 1; i >= 0; i--) {
    if (s[i] == ')')
      st.push(s[i]);
    else {
      if (!st.empty() && st.top() == ')') {
        st.pop();
      } else
        st.push(s[i]);
    }
  }
  string ret = "";
  while (!st.empty()) {
    char c = st.top();
    ret += c;
    st.pop();
  }
  return ret;
}
long long need(string s) {
  char c = s[0];
  long long sz = s.size(), i;
  if (sz == 0) return 0;
  bool f = 1;
  long long cnt = 0;
  for (i = 0; i < sz; i++) {
    if (s[i] != c) {
      f = 0;
      break;
    }
    cnt++;
  }
  if (f == 0) return LONG_LONG_MAX;
  if (c == '(') {
    return cnt;
  } else
    return ((-1) * cnt);
}
int main() {
  long long n;
  cin >> n;
  long long i;
  map<long long, long long> mp;
  for (i = 1; i <= n; i++) {
    cin >> s[i];
    s[i] = process(s[i]);
    long long nd = need(s[i]);
    if (nd != LONG_LONG_MAX) mp[nd]++;
  }
  long long ans = 0;
  bool f = 1;
  for (__typeof((mp).end()) it = (mp).begin(); it != (mp).end(); it++) {
    long long x = it->first;
    long long y = it->second;
    if (x == 0) {
      if (f) {
        f = 0;
        ans += (y / 2);
      }
    } else {
      long long nd = (0 - x);
      ans += min(y, mp[nd]);
      mp[nd] = 0;
      mp[x] = 0;
    }
  }
  cout << ans << "\n";
  return 0;
}
