結果
| 問題 |
No.2918 Divide Applicants Fairly
|
| ユーザー |
けいと
|
| 提出日時 | 2024-10-09 01:39:27 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,835 bytes |
| コンパイル時間 | 6,761 ms |
| コンパイル使用メモリ | 288,492 KB |
| 実行使用メモリ | 194,056 KB |
| 最終ジャッジ日時 | 2024-10-09 01:39:38 |
| 合計ジャッジ時間 | 7,969 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | TLE * 1 -- * 60 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
vector<vector<vector<int>>> generate_half(const vector<int>& R) {
int n = R.size();
vector<vector<vector<int>>> dp(21, vector<vector<int>>(21, vector<int>()));
dp[0][0].push_back(0);
for(auto r : R){
for(int s_red = 20; s_red >=0; s_red--){
for(int s_blue = 20; s_blue >=0; s_blue--){
if(dp[s_red][s_blue].empty()) continue;
if(s_red <20){
for(auto sum_diff : dp[s_red][s_blue]){
dp[s_red+1][s_blue].push_back(sum_diff + r);
}
}
if(s_blue <20){
for(auto sum_diff : dp[s_red][s_blue]){
dp[s_red][s_blue+1].push_back(sum_diff - r);
}
}
}
}
}
for(int s_red=0; s_red<=20; s_red++){
for(int s_blue=0; s_blue<=20; s_blue++){
if(dp[s_red][s_blue].empty()) continue;
sort(dp[s_red][s_blue].begin(), dp[s_red][s_blue].end());
dp[s_red][s_blue].erase(unique(dp[s_red][s_blue].begin(), dp[s_red][s_blue].end()), dp[s_red][s_blue].end());
}
}
return dp;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int N;
cin >> N;
vector<int> R(N);
for(auto &x : R) cin >> x;
int mid = N /2;
vector<int> A(R.begin(), R.begin()+mid);
vector<int> B(R.begin()+mid, R.end());
vector<vector<vector<int>>> dp_A = generate_half(A);
vector<vector<vector<int>>> dp_B = generate_half(B);
int min_diff = INT32_MAX;
for(int k=1; k <= min(20, N/2); k++){
for(int s_red_a=0; s_red_a <=k; s_red_a++){
int s_blue_a = k - s_red_a;
if(s_blue_a <0 || s_blue_a > (int)A.size()) continue;
int s_red_b = k - s_red_a;
int s_blue_b = k - s_blue_a;
if(s_red_b <0 || s_blue_b <0 || s_red_b > (int)B.size() || s_blue_b > (int)B.size()) continue;
for(auto sum_diff_a : dp_A[s_red_a][s_blue_a]){
const vector<int>& vec = dp_B[s_red_b][s_blue_b];
if(vec.empty()) continue;
int target = -sum_diff_a;
auto it = lower_bound(vec.begin(), vec.end(), target);
if(it != vec.end()){
int sum_diff_b = *it;
min_diff = min(min_diff, abs(sum_diff_a + sum_diff_b));
}
if(it != vec.begin()){
it--;
int sum_diff_b = *it;
min_diff = min(min_diff, abs(sum_diff_a + sum_diff_b));
}
}
}
}
cout << min_diff << "\n";
}
けいと