#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const int MOD = 1000000007;
const int INF = 1000000000;
const long long int LINF = 1 << 30;
template <typename T>
void printv(vector<T> const& s) {
  for (int i = (0); i < (((int)(s).size())); i++) {
    cout << s[i] << " ";
  }
  cout << endl;
}
signed main() {
  cin.tie(0);
  cout << setprecision(10);
  int n;
  cin >> n;
  vector<string> a(n);
  for (int i = (0); i < (n); i++) cin >> a[i];
  map<int, int> m;
  for (int i = (0); i < (n); i++) {
    int cnt = 0;
    stack<bool> st;
    for (int j = (0); j < (((int)(a[i]).size())); j++) {
      if (a[i][j] == '(') {
        st.push(1);
        cnt++;
      } else {
        if (!st.empty() && st.top() == 1)
          st.pop();
        else
          st.push(0);
        cnt--;
      }
    }
    bool ok = true;
    if (!st.empty()) {
      bool c = st.top();
      st.pop();
      while (!st.empty()) {
        if (c != st.top()) {
          ok = false;
          break;
        } else {
          st.pop();
        }
      }
    }
    if (ok) m[cnt]++;
  }
  int ans = 0;
  vector<int> c;
  for (auto i = (m).begin(); i != (m).end(); i++) {
    if (i->first >= 0) c.push_back(i->first);
  }
  for (int i = (0); i < (((int)(c).size())); i++) {
    if (c[i] == 0)
      ans += m[c[i]] / 2;
    else
      ans += min(m[c[i]], m[-c[i]]);
  }
  cout << ans << endl;
}
