結果
問題 | No.1594 Three Classes |
ユーザー | sirosai |
提出日時 | 2022-08-22 08:37:40 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 236 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 49 ms
5,248 KB |
testcase_04 | AC | 227 ms
5,248 KB |
testcase_05 | AC | 224 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 44 ms
5,248 KB |
testcase_08 | AC | 226 ms
5,248 KB |
testcase_09 | AC | 222 ms
5,248 KB |
testcase_10 | AC | 226 ms
5,248 KB |
testcase_11 | AC | 224 ms
5,248 KB |
testcase_12 | AC | 225 ms
5,248 KB |
testcase_13 | AC | 2 ms
5,248 KB |
testcase_14 | AC | 46 ms
5,248 KB |
testcase_15 | AC | 2 ms
5,248 KB |
testcase_16 | AC | 2 ms
5,248 KB |
testcase_17 | AC | 1 ms
5,248 KB |
testcase_18 | AC | 1 ms
5,248 KB |
testcase_19 | AC | 3 ms
5,248 KB |
testcase_20 | AC | 3 ms
5,248 KB |
ソースコード
#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; }