結果
| 問題 |
No.1594 Three Classes
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-08-22 08:37:40 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 236 ms / 2,000 ms |
| コード長 | 1,907 bytes |
| コンパイル時間 | 1,616 ms |
| コンパイル使用メモリ | 175,380 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-16 08:40:41 |
| 合計ジャッジ時間 | 4,470 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 18 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n, m) for (ll i = n; i < (ll)(m); i++)
#define rrep(i, n, m) for (ll i = n; i <= (ll)(m); i++)
using ll = long long;
int N;
bool chk(ll k, vector<int> E) {
// kを3進数に変換する
string base3 = "";
while (k != 0) {
if (k % 3 == 0) base3 = '0' + base3;
if (k % 3 == 1) base3 = '1' + base3;
if (k % 3 == 2) base3 = '2' + base3;
k = k / 3;
}
// base3にN桁まで0埋めする
ll keta = N - base3.size();
string append(keta, '0');
base3 = append + base3;
// cout << base3 << endl;
// return true;
// base3のi桁目の数値が0⇒A、1⇒B、2⇒Cとして、E[i]を足し込む
ll A = 0, B = 0, C = 0;
rrep(i, 0, N - 1) {
if (base3.at(i) == '0') A += E.at(i);
if (base3.at(i) == '1') B += E.at(i);
if (base3.at(i) == '2') C += E.at(i);
}
// 判定
if (A == B and B == C)
return true;
else
return false;
}
int main() {
cin >> N;
vector<int> E(N);
rrep(i, 0, N - 1) cin >> E.at(i);
// sum{i∈I} (Ei) = sum{j∈J} (Ej) = sum{k∈K} (Ek)
// となるようなI,J,Kが存在すればYes, else Noを出力する
// I,J,Kは互いに素な集合とする
// 全探索すると、N<=12なので、12を3つに分割する。ただし最低1つ含む。
// とりあえずソートしておく
sort(E.begin(), E.end());
// 3進数でbit全探索ぽいことをする
// 0からpow(3,N) -1 まで
// k桁目が0or1or2でどのクラスに属するかを全探索
rrep(k, 0, pow(3, N) - 1) {
// kとEから条件を満たすかをチェックする
// ひとつでも満たせば終了
if (chk(k, E)) {
cout << "Yes" << endl;
return 0;
}
}
cout << "No" << endl;
return 0;
}