結果
問題 |
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; }