#include #include #include #include #include #include #include #include #include #include static const int MOD = 1000000007; using ll = long long; using u32 = unsigned; using u64 = unsigned long long; using namespace std; template constexpr T INF = ::numeric_limits::max()/32*15+208; template vector make_v(U size, const T& init){ return vector(static_cast(size), init); } template auto make_v(U size, Ts... rest) { return vector(static_cast(size), make_v(rest...)); } template void chmin(T &a, const T &b){ a = (a < b ? a : b); } template void chmax(T &a, const T &b){ a = (a > b ? a : b); } int main() { int n; cin >> n; vector a(n+1), b(n+1), d(n); for (auto &&i : a) scanf("%d", &i); for (auto &&j : b) scanf("%d", &j); for (auto &&k : d) scanf("%d", &k); auto dp = make_v(n+1, n+1, -1); sort(d.begin(),d.end()); dp[0][0] = n; int ans = 0; for (int i = 0; i <= n; ++i) { for (int j = 0; i+j <= n; ++j) { int val = a[i]+b[j]; if(i && dp[i-1][j] >= 0){ auto x = upper_bound(d.begin(),d.begin()+dp[i-1][j], val); dp[i][j] = max(dp[i][j], (x-d.begin())-1); } if(j && dp[i][j-1] >= 0){ auto x = upper_bound(d.begin(),d.begin()+dp[i][j-1], val); dp[i][j] = max(dp[i][j], (x-d.begin())-1); } if(dp[i][j] >= 0) ans = max(ans, i+j); } } cout << ans << "\n"; return 0; }