#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; typedef pair pcc; typedef pair P; typedef tuple t3; #define rep(i,a) for(ll i = 0;i < a;i++) template void cmax(T& a, const T b){a=max(a,b);} int main(void) { ll n; cin >> n; vector as(n+1); vector bs(n+1); vector ds(n); rep(i,n+1) cin >> as[i]; rep(i,n+1) cin >> bs[i]; rep(i,n) cin >> ds[i]; sort(ds.begin(), ds.end(), std::greater()); ll left = -1; ll right = n + 1; while(right - left > 1) { ll middle = left + right; middle /= 2; vector> dp(n+1,vector(n+1, false)); dp[0][0] = true; for(int i = 0; i < n;i++){ dp[i+1][0] = dp[i][0] && (as[i+1] + bs[0] >= ds[n - middle + i]); dp[0][i+1] = dp[0][i] && (as[0] + bs[i+1] >= ds[n - middle + i]); } for(int i = 0;i < n;i++){ for(int j = 0; j + i < n && n - middle + i + j < n;j++){ dp[i+1][j+1] = (dp[i][j+1] | dp[i+1][j]) && (as[i+1] + bs[j+1] >= ds[n - middle + i + j]); } } bool ok = false; for(int i = 0; middle-i >=0 && i <= n;i++){ if(dp[middle-i][0 + i]){ ok = true; break; } } if(ok){ left = middle; } else{ right = middle; } } cout << left << endl; return 0; }