難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) Lv.3.7 (3票)

投票の分布
  1. Lv.10票
  2. Lv.20票
  3. Lv.31票
  4. Lv.42票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Truth or Lie

作成者 shuphy129

難易度(作成者設定) Lv.3

難易度(投票) Lv.3.7 (3票)

実行時間制限
2 秒
メモリ制限
512 MiB

解説

最初に以下の質問をします。

  • xx は 11 以上 NN 以下の整数か。

これは明らかに真であり、0 と返されたならばジャッジは嘘つきです。
嘘つきの場合、以降は応答を逆の意味で受け取ればよいです。

残るは典型問題であり、二分探索で効率的に求めることができます。

二分探索では log⁡105<17\log{10^5} < 17 より高々 1717 回質問すれば特定でき、最初の質問と合わせても 2020 回以内に収まります。よって、この問題を解くことができました。

実装例(C++):

#include <bits/stdc++.h>
using namespace std;

int main(){
    int N;
    cin >> N;

    cout << "? " << 1 << " " << N << endl;

    int res;
    cin >> res;

    bool liar = false;
    if(res == 0){ // 嘘つき確定
        liar = true;
    }

    int left = 1, right = N;
    while(left < right){
        int mid = (left + right) / 2;

        cout << "? " << left << " " << mid << endl;

        cin >> res;

        if(liar) res ^= 1; // 01を反転

        if(res == 1){
            right = mid;
        } else {
            left = mid + 1;
        }
    }

    cout << "! " << left << endl;
    return 0;
}

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。