PROBLEM_TOTAL = int(input()) SOLVE_TIMES = list(map(int, input().split())) TIME_LIMITS = list(map(int, input().split())) SOLVE_TIMES.sort(reverse = True) TIME_LIMITS.sort(reverse = True) SKIPPED = 1 BEST_TIMES =[[-1] * PROBLEM_TOTAL for is_skipped in (not SKIPPED, SKIPPED)] def search_best_times(skipped): pre_problem_i = -1 for music_i, time_limit in enumerate(TIME_LIMITS): if skipped and music_i == 0: continue for problem_i in range(pre_problem_i + 1, PROBLEM_TOTAL): solve_time = SOLVE_TIMES[problem_i] if solve_time < time_limit: BEST_TIMES[skipped][music_i] = solve_time pre_problem_i = problem_i break search_best_times(not SKIPPED) search_best_times(SKIPPED) def main(): dp = [0, TIME_LIMITS[0]] for music_i, time_limit in enumerate(TIME_LIMITS): if music_i == PROBLEM_TOTAL - 1: break if BEST_TIMES[SKIPPED][music_i] > -1: dp[SKIPPED] += BEST_TIMES[SKIPPED][music_i] if music_i > 0: dp[SKIPPED] = max(dp[SKIPPED], dp[not SKIPPED] + time_limit) if BEST_TIMES[not SKIPPED][music_i] > -1: dp[not SKIPPED] += BEST_TIMES[not SKIPPED][music_i] ans = dp[SKIPPED] print(ans) if __name__ == "__main__": main()