結果
問題 | No.437 cwwゲーム |
ユーザー |
![]() |
提出日時 | 2019-04-20 18:15:43 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 112 ms / 2,000 ms |
コード長 | 6,198 bytes |
コンパイル時間 | 1,703 ms |
コンパイル使用メモリ | 170,732 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-10-12 08:52:04 |
合計ジャッジ時間 | 6,953 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 41 |
ソースコード
#include <bits/stdc++.h>using namespace std;// Use of dynamic bitset to convert decimal numbers.// https://stackoverflow.com/questions/42759330/use-of-dynamic-bitset-to-convert-decimal-numbers// 10進数 → 2進数.// @param n: 2進数へ変換したい10進数.// @param d: 2進数表記する桁数.// @return: 2進数.string decimalToBinary(int n, int d) {// 1. ゼロの場合.string ret = "";if(n == 0){while(ret.size() < d) ret = "0" + ret;return ret;}// 2. ゼロでない場合.int ln = abs(n);do{ret = string((ln & 1) ? "1" : "0") + ret;}while((ln /= 2) > 0);while(ret.size() < d) ret = "0" + ret;// 3. 負数の場合.if(n < 0) ret = "-" + ret;return ret;}// 組み合わせnC3に対応する文字列を作成.// ※ n が, 小さい時しか使えないので要注意.// @param n: nC3 の n.// @param l: 文字列長.// @return: nC3 に対応する文字列.set<string> makeCombinationBox(int n, int l){set<string> ret;for(int i = 0; i < l; i++){for(int j = i + 1; j < l; j++){for(int k = j + 1; k < l; k++){string a(l, '0');a[i] = a[j] = a[k] = '1';ret.insert(a);}}}return ret;}// CWW文字であるか判定.// @param a0: 1文字目.// @param a1: 2文字目.// @param a2: 3文字目.// @return: true … CWW文字である, false … CWW文字では無い.bool checkCWW(char a0, char a1, char a2){if(a0 != '0' && a1 == a2 && a0 != a1) return true;else return false;}int main() {// 1. 入力情報取得.string N;cin >> N;while(N.size() < 13) N = "0" + N;// cout << "N=" << N << endl;// 2. scoreの最大値を計算.// 13C3 * 10C3 * 7C3 * 4C3 = 286 * 120 * 35 * 4 = 4804800通り の 計算?// 2-1. 13C3, 10C3, 7C3, 4C3 の 情報を保存する箱の作成.set<string> c13_3 = makeCombinationBox(13, 13);set<string> c10_3 = makeCombinationBox(10, 10);set<string> c7_3 = makeCombinationBox(7, 7);set<string> c4_3 = makeCombinationBox(4, 4);// for(auto &p : c13_3) cout << p << endl;// for(auto &p : c10_3) cout << p << endl;// for(auto &p : c7_3) cout << p << endl;// for(auto &p : c4_3) cout << p << endl;// 2-2. 13C3, 10C3, 7C3, 4C3 の 情報を配列に変換.int a13_3[286][3];int a10_3[120][3];int a7_3[35][3];int a4_3[4][3];int r = 0;for(auto &p : c13_3){int c = 0;for(int i = 0; i < 13; i++) if(p[i] == '1') a13_3[r][c] = i, c++;r++;}r = 0;for(auto &p : c10_3){int c = 0;for(int i = 0; i < 10; i++) if(p[i] == '1') a10_3[r][c] = i, c++;r++;}r = 0;for(auto &p : c7_3){int c = 0;for(int i = 0; i < 7; i++) if(p[i] == '1') a7_3[r][c] = i, c++;r++;}r = 0;for(auto &p : c4_3){int c = 0;for(int i = 0; i < 4; i++) if(p[i] == '1') a4_3[r][c] = i, c++;r++;}// for(int i = 0; i < 286; i++) cout << a13_3[i][0] << " " << a13_3[i][1] << " " << a13_3[i][2] << endl;// 2-3. CWW に 関する情報を取得し, 計算.int ans = 0;// 13C3通りの確認.for(int i = 0; i < 286; i++){int stock = 0;int cww13_3 = 0;string cwwI = N;if(checkCWW(cwwI[a13_3[i][0]], cwwI[a13_3[i][1]], cwwI[a13_3[i][2]])){cww13_3 = 100 * (cwwI[a13_3[i][0]] - '0') + 10 * (cwwI[a13_3[i][1]] - '0') + (cwwI[a13_3[i][2]] - '0');stock = cww13_3;// 最大値更新.ans = max(ans, stock);}// 文字列 cwwI を編集.cwwI.erase(a13_3[i][2], 1);cwwI.erase(a13_3[i][1], 1);cwwI.erase(a13_3[i][0], 1);// 10C3通りの確認.for(int j = 0; j < 120; j++){string cwwJ = cwwI;int cww10_3 = 0;if(checkCWW(cwwJ[a10_3[j][0]], cwwJ[a10_3[j][1]], cwwJ[a10_3[j][2]])){cww10_3 = 100 * (cwwJ[a10_3[j][0]] - '0') + 10 * (cwwJ[a10_3[j][1]] - '0') + (cwwJ[a10_3[j][2]] - '0');stock = cww13_3 + cww10_3;// 最大値更新.ans = max(ans, stock);}else{stock = cww13_3;}// 文字列 cwwJ を編集.cwwJ.erase(a10_3[j][2], 1);cwwJ.erase(a10_3[j][1], 1);cwwJ.erase(a10_3[j][0], 1);// 7C3通りの確認.for(int k = 0; k < 35; k++){string cwwK = cwwJ;int cww7_3 = 0;if(checkCWW(cwwK[a7_3[k][0]], cwwK[a7_3[k][1]], cwwK[a7_3[k][2]])){cww7_3 = 100 * (cwwK[a7_3[k][0]] - '0') + 10 * (cwwK[a7_3[k][1]] - '0') + (cwwK[a7_3[k][2]] - '0');stock = cww13_3 + cww10_3 + cww7_3;// 最大値更新.ans = max(ans, stock);}else{stock = cww13_3 + cww10_3;}// 文字列 cwwK を編集.cwwK.erase(a7_3[k][2], 1);cwwK.erase(a7_3[k][1], 1);cwwK.erase(a7_3[k][0], 1);// 4C3通りの確認.for(int l = 0; l < 4; l++){string cwwL = cwwK;if(checkCWW(cwwK[a4_3[l][0]], cwwK[a4_3[l][1]], cwwK[a4_3[l][2]])){int cww4_3 = 100 * (cwwL[a4_3[l][0]] - '0') + 10 * (cwwL[a4_3[l][1]] - '0') + (cwwL[a4_3[l][2]] - '0');stock = cww13_3 + cww10_3 + cww7_3 + cww4_3;// 最大値更新.ans = max(ans, stock);}else{stock = cww13_3 + cww10_3 + cww7_3;}}}}}// 4. 出力.// ex.// 253432030884 (344) -> 253203088 (588) -> 232030 (233) -> 200 (200) -> なし で, 合計 1365.cout << ans << endl;return 0;}