結果
| 問題 |
No.949 飲酒プログラミングコンテスト
|
| コンテスト | |
| ユーザー |
kyort0n
|
| 提出日時 | 2019-12-12 00:06:44 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 70 ms / 2,500 ms |
| コード長 | 1,411 bytes |
| コンパイル時間 | 1,568 ms |
| コンパイル使用メモリ | 170,092 KB |
| 実行使用メモリ | 12,428 KB |
| 最終ジャッジ日時 | 2024-06-24 08:08:11 |
| 合計ジャッジ時間 | 3,386 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 29 |
ソースコード
//Happy Birthday @rian_tkb !!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template<class T>
inline bool chmax(T &a, T b) {
if(a < b) {
a = b;
return true;
}
return false;
}
template<class T>
inline bool chmin(T &a, T b) {
if(a > b) {
a = b;
return true;
}
return false;
}
ll N;
ll A[3005], B[3005], D[3005];
bool dp[3005][3005];
bool f(int num) {
for(int i = 0; i <= 3000; i++) {
for(int j = 0; j <= 3000; j++) {
dp[i][j] = false;
}
}
dp[0][0] = true;
for(int i = 0; i <= num; i++) {
for(int j = 0; j <= num - i; j++) {
bool can = false;
if(i > 0 && dp[i-1][j]) can = true;
if(j > 0 && dp[i][j-1]) can = true;
if(!can) continue;
if(D[num-i-j] <= A[i] + B[j]) dp[i][j] = true;
}
}
for(int i = 0; i <= num; i++) {
if(dp[i][num-i]) return true;
}
return false;
}
int main() {
cin >> N;
for(int i = 0; i <= N; i++) cin >> A[i];
for(int i = 0; i <= N; i++) cin >> B[i];
for(int i = 0; i < N; i++) cin >> D[i];
sort(D, D + N);
ll ok = 0;
ll ng = N + 1;
while(ng - ok > 1) {
ll mid = (ok + ng) / 2;
if(f(mid)) ok = mid;
else ng = mid;
}
cout << ok << endl;
return 0;
}
kyort0n