結果
| 問題 |
No.2918 Divide Applicants Fairly
|
| ユーザー |
けいと
|
| 提出日時 | 2024-10-09 00:23:55 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,180 bytes |
| コンパイル時間 | 1,326 ms |
| コンパイル使用メモリ | 99,112 KB |
| 実行使用メモリ | 403,312 KB |
| 最終ジャッジ日時 | 2024-10-09 00:24:00 |
| 合計ジャッジ時間 | 4,839 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | TLE * 1 -- * 60 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <cmath>
#include <climits>
#include <bitset>
using namespace std;
typedef long long ll;
int N;
vector<int> R;
int main() {
cin >> N;
R.resize(N);
ll total_sum = 0;
for (int i = 0; i < N; ++i) {
cin >> R[i];
total_sum += R[i];
}
ll min_diff = LLONG_MAX;
if (N <= 40) {
int total_N = N;
vector<int> indices(N);
for (int i = 0; i < N; ++i) {
indices[i] = i;
}
for (int total_k = 2; total_k <= N; total_k += 2) {
vector<vector<int>> subsets;
vector<bool> select(N, false);
for (int i = 0; i < total_k; ++i) {
select[i] = true;
}
do {
vector<int> subset_indices;
for (int i = 0; i < N; ++i) {
if (select[i]) {
subset_indices.push_back(i);
}
}
subsets.push_back(subset_indices);
} while (prev_permutation(select.begin(), select.end()));
for (auto& subset : subsets) {
int k = total_k / 2;
int subset_size = subset.size();
vector<int> subset_ratings;
for (int idx : subset) {
subset_ratings.push_back(R[idx]);
}
int m = subset_size;
vector<bool> team_select(m, false);
for (int i = 0; i < k; ++i) {
team_select[i] = true;
}
ll total_selected_sum = 0;
for (int r : subset_ratings) {
total_selected_sum += r;
}
do {
ll team1_sum = 0;
for (int i = 0; i < m; ++i) {
if (team_select[i]) {
team1_sum += subset_ratings[i];
}
}
ll team2_sum = total_selected_sum - team1_sum;
ll diff = abs(team1_sum - team2_sum);
if (diff < min_diff) {
min_diff = diff;
}
} while (prev_permutation(team_select.begin(), team_select.end()));
}
}
} else {
int total_k = N;
if (total_k % 2 != 0) {
total_k = N - 1;
}
vector<pair<int, int>> rating_with_index;
for (int i = 0; i < N; ++i) {
rating_with_index.emplace_back(R[i], i);
}
sort(rating_with_index.begin(), rating_with_index.end(), greater<pair<int, int>>());
ll team1_sum = 0;
ll team2_sum = 0;
for (int i = 0; i < total_k; ++i) {
if (i % 2 == 0) {
team1_sum += rating_with_index[i].first;
} else {
team2_sum += rating_with_index[i].first;
}
}
ll diff = abs(team1_sum - team2_sum);
if (diff < min_diff) {
min_diff = diff;
}
}
cout << min_diff << endl;
return 0;
}
けいと