1 条题解

  • 0
    @ 2025-4-18 15:45:30

    解题思路

    题意分析

    本题是关于一个猜数字游戏的逻辑判断问题。在游戏中,Stan 心中想一个在 111010 之间的整数,Ollie 进行猜测,Stan 给出“太高(too high)”“太低(too low)”或“正好(right on)”的反馈。Ollie 记录了多轮游戏的对话记录,需要根据这些记录判断 Stan 是否存在作弊行为,即判断 Stan 的反馈是否与最终答案存在矛盾。输入是多组游戏记录,每组记录包含若干“猜测-响应”对,以“right on”结束,输入以单独的 00 终止。输出则是对于每组游戏,判断 Stan 是否诚实。

    解题思路

    1. 数据初始化
      • 定义一个长度为 1111 的数组 hash,用于记录每个数字(111010)的猜测反馈情况,初始化为 00hash[i] = 0 表示数字 ii 还未被猜测过,hash[i] = 1 表示猜测数字 ii 时得到“太高”的反馈,hash[i] = -1 表示猜测数字 ii 时得到“太低”的反馈。
      • 定义一个 vector<int> 类型的变量 jg,用于存储每轮游戏判断 Stan 是否作弊的结果(00 表示可能诚实,11 表示作弊)。
      • 定义一个 flag 变量,初始值为 00,用于标记当前游戏中 Stan 是否作弊,00 表示尚未发现作弊,11 表示发现作弊。
    2. 游戏记录处理
      • 使用一个无限循环 while(1) 来处理输入,直到输入为 00 时跳出循环。
      • 每次读取一个猜测的整数 a,如果 a == 0,则结束整个输入过程。
      • 读取 a 对应的响应字符串 b
      • 根据响应字符串进行不同的处理:
        • 如果 b == "too high"flag == 0(即尚未发现作弊):若 hash[a] == 0,则将 hash[a] 赋值为 11;若 hash[a] == 1,不做处理;若 hash[a] == -1,则将 flag 赋值为 11,表示发现作弊。
        • 如果 b == "too low"flag == 0:若 hash[a] == 0,则将 hash[a] 赋值为 1-1;若 hash[a] == -1,不做处理;若 hash[a] == 1,则将 flag 赋值为 11
        • 如果 b == "right on"
          • flag == 0,则遍历 hash 数组(从 111010)。对于每个数字 i,若 i < ahash[i] == 1,或者 i > ahash[i] == -1,或者 i == ahash[i] != 0,则将 flag 赋值为 11,表示发现作弊。
          • flag 的值存入 jg 数组中,然后将 hash 数组重新初始化为 00,并将 flag 重置为 00,准备处理下一轮游戏。
    3. 结果输出
      • 遍历 jg 数组,对于每个元素 jg[i],若 jg[i] == 0,则输出 "Stan may be honest";若 jg[i] == 1,则输出 "Stan is dishonest"

    ##参考代码

    #include <iostream>
    #include <vector>
    #include <cstring>
    using namespace std;
     
    int main() {
        vector<string> results;
        while (true) {
            int guess;
            cin >> guess;
            if (guess == 0) {
                break;
            }
            
            int min_possible = 1;
            int max_possible = 10;
            bool dishonest = false;
            string response;
            getline(cin, response); // consume the newline after guess 
            
            while (true) {
                getline(cin, response);
                if (response == "right on") {
                    if (guess < min_possible || guess > max_possible) {
                        dishonest = true;
                    }
                    break;
                } else if (response == "too high") {
                    if (guess <= min_possible) {
                        dishonest = true;
                    }
                    if (guess - 1 < max_possible) {
                        max_possible = guess - 1;
                    }
                } else if (response == "too low") {
                    if (guess >= max_possible) {
                        dishonest = true;
                    }
                    if (guess + 1 > min_possible) {
                        min_possible = guess + 1;
                    }
                }
                
                cin >> guess;
                getline(cin, response); // consume the newline after guess 
            }
            
            if (dishonest) {
                results.push_back("Stan  is dishonest");
            } else {
                results.push_back("Stan  may be honest");
            }
        }
        
        for (size_t i = 0; i < results.size();  ++i) {
            cout << results[i] << endl;
        }
        
        return 0;
    }
    • 1

    信息

    ID
    1329
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    8
    已通过
    1
    上传者