結果
問題 |
No.3246 80% Accuracy Calculator
|
ユーザー |
![]() |
提出日時 | 2025-07-27 01:21:15 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,704 bytes |
コンパイル時間 | 919 ms |
コンパイル使用メモリ | 85,820 KB |
実行使用メモリ | 26,284 KB |
平均クエリ数 | 599.37 |
最終ジャッジ日時 | 2025-07-27 02:50:24 |
合計ジャッジ時間 | 5,013 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 3 RE * 40 |
ソースコード
#include <cassert> #include <iostream> #include <map> #include <vector> using namespace std; using ll = long long; ll get_most(char reg, ll times) { map<ll, ll> mp; for (ll i = 0; i < times; i++) { cout << "? " << reg << endl; ll val; cin >> val; if (val == -1) { return -1; } mp[val]++; } ll max_times = 0; ll max_val = -1; for (auto it = mp.begin(); it != mp.end(); it++) { if (max_times < it->second) { max_times = it->second; max_val = it->first; } } return max_val; } int main() { const ll iter_times = 100; ll x = get_most('A', iter_times); ll y = get_most('B', iter_times); // 繰り返し二倍法を実装する vector<ll> bins(10); for (ll i = 0; i < 10; i++) { if ((y >> i) & 1) { bins[i] = 1; } } vector<ll> ans = {x, y, 0}; ll now_x = 0; ll now_ans = 2; for (ll i = 0; i < 10; i++) { // そのビットがあるなら足す if (bins[i]) { while (true) { char reg1 = (char)(now_x + 'A'); char reg2 = (char)(now_ans + 'A'); ll r3 = 3 - now_x - now_ans; char reg3 = (char)(r3 + 'A'); ans[r3] = ans[now_x] + ans[now_ans]; cout << "+ " << reg1 << " " << reg2 << " " << reg3 << endl; ll z; cin >> z; if (z != 0) { return 0; } now_ans = r3; ll val = get_most(reg3, iter_times); if (val == -1) { return 0; } if (val == ans[r3]) { break; } else { return 1; } } } // x + x = 2x をする while (true) { char reg1 = (char)(now_x + 'A'); ll r2 = 3 - now_x - now_ans; char reg2 = (char)(r2 + 'A'); cout << "+ " << reg1 << " " << reg1 << " " << reg2 << endl; ans[r2] = ans[now_x] + ans[now_x]; now_x = r2; ll z; cin >> z; if (z != 0) { return 0; } ll val = get_most(reg2, iter_times); if (val == -1) { return 0; } if (val == ans[r2]) { break; } else { return 1; } } if (ans[now_ans] == x * y) { break; } } char reg = (char)(now_ans + 'A'); cout << "! " << reg << endl; }