結果
問題 | No.594 壊れた宝物発見機 |
ユーザー |
|
提出日時 | 2017-11-10 23:32:34 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 117 ms / 2,000 ms |
コード長 | 1,285 bytes |
コンパイル時間 | 657 ms |
コンパイル使用メモリ | 69,512 KB |
実行使用メモリ | 25,348 KB |
平均クエリ数 | 54.90 |
最終ジャッジ日時 | 2024-07-16 14:34:49 |
合計ジャッジ時間 | 4,584 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 20 |
ソースコード
#include <iostream>#include <cstdio>#include <vector>#include <algorithm>#include <utility>#include <string>using namespace std;int ask(int x, int y, int z) {int d;cout << "?" << " " << x << " " << y << " " << z << endl;cin >> d;return d;}int ask(int val, char which) {int d = -99;switch (which) {case 'x': d = ask(val, 0, 0); break;case 'y': d = ask( 0, val, 0); break;case 'z': d = ask( 0, 0, val); break;default: break;}return d;}// 回答クエリvoid answer(int x, int y, int z) {cout << "!" << " " << x << " " << y << " " << z << endl;}int calc(char which) {int upper = 150;int mid = 0;int lower = -150;while (upper - lower > 2) {int d_upper = ask(upper, which);int d_lower = ask(lower, which);if (d_upper > d_lower) {upper = mid;mid = (lower + mid) / 2;} else {lower = mid;mid = (mid + upper) / 2;}}int d_upper = ask(upper, which);int d_mid = ask(mid, which);int d_lower = ask(lower, which);int d_min = min({d_lower, d_mid, d_upper});if (d_min == d_upper) {return upper;} else if (d_min == d_mid) {return mid;} else {return lower;}}int main() {int x = calc('x');int y = calc('y');int z = calc('z');answer(x, y, z);return 0;}