結果
問題 | No.594 壊れた宝物発見機 |
ユーザー |
👑 |
提出日時 | 2019-09-23 19:02:05 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 119 ms / 2,000 ms |
コード長 | 1,389 bytes |
コンパイル時間 | 616 ms |
コンパイル使用メモリ | 75,488 KB |
実行使用メモリ | 25,460 KB |
平均クエリ数 | 83.50 |
最終ジャッジ日時 | 2024-07-16 18:08:25 |
合計ジャッジ時間 | 4,348 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
#include <cstdio> #include <cstdlib> #include <cstddef> #include <vector> #include <algorithm> #include <cmath> #include <cstring> #include <string> #include <iostream> #include <iomanip> #include <numeric> #include <set> #define L64 long long #define UL64 unsigned long long #define MOD (1000000007LL) using namespace std; int ask(int pos, int val) { int d; int x = pos == 0 ? val : 0; int y = pos == 1 ? val : 0; int z = pos == 2 ? val : 0; cout << "?" << " " << x << " " << y << " " << z << endl; cin >> d; return d; } void answer(int x, int y, int z) { cout << "!" << " " << x << " " << y << " " << z << endl; } int solve(int pos) { int left = -150; int right = 150; int vl = ask(pos, left); int vr = ask(pos, right); while(true){ int mid1 = (left * 2 + right) / 3; int mid2 = (left + right * 2) / 3; int vm1 = ask(pos, mid1); int vm2 = ask(pos, mid2); bool det = (right - left) <= 3; if(vl < vm1){ if(det) return left; right = mid1; vr = vm1; } else if(vm1 < vm2){ if(det) return mid1; right = mid2; vr = vm2; } else if(vm2 < vr){ if(det) return mid2; left = mid1; vl = vm1; } else { if(det) return right; left = mid2; vl = vm2; } } return 0; } int main(void) { int x = solve(0); int y = solve(1); int z = solve(2); answer(x, y, z); }