1 条题解
-
0
解题思路
题意分析
本题是关于一个猜数字游戏的逻辑判断问题。在游戏中,Stan 心中想一个在 到 之间的整数,Ollie 进行猜测,Stan 给出“太高(too high)”“太低(too low)”或“正好(right on)”的反馈。Ollie 记录了多轮游戏的对话记录,需要根据这些记录判断 Stan 是否存在作弊行为,即判断 Stan 的反馈是否与最终答案存在矛盾。输入是多组游戏记录,每组记录包含若干“猜测-响应”对,以“right on”结束,输入以单独的 终止。输出则是对于每组游戏,判断 Stan 是否诚实。
解题思路
- 数据初始化:
- 定义一个长度为 的数组
hash
,用于记录每个数字( 到 )的猜测反馈情况,初始化为 。hash[i] = 0
表示数字 还未被猜测过,hash[i] = 1
表示猜测数字 时得到“太高”的反馈,hash[i] = -1
表示猜测数字 时得到“太低”的反馈。 - 定义一个
vector<int>
类型的变量jg
,用于存储每轮游戏判断 Stan 是否作弊的结果( 表示可能诚实, 表示作弊)。 - 定义一个
flag
变量,初始值为 ,用于标记当前游戏中 Stan 是否作弊, 表示尚未发现作弊, 表示发现作弊。
- 定义一个长度为 的数组
- 游戏记录处理:
- 使用一个无限循环
while(1)
来处理输入,直到输入为 时跳出循环。 - 每次读取一个猜测的整数
a
,如果a == 0
,则结束整个输入过程。 - 读取
a
对应的响应字符串b
。 - 根据响应字符串进行不同的处理:
- 如果
b == "too high"
且flag == 0
(即尚未发现作弊):若hash[a] == 0
,则将hash[a]
赋值为 ;若hash[a] == 1
,不做处理;若hash[a] == -1
,则将flag
赋值为 ,表示发现作弊。 - 如果
b == "too low"
且flag == 0
:若hash[a] == 0
,则将hash[a]
赋值为 ;若hash[a] == -1
,不做处理;若hash[a] == 1
,则将flag
赋值为 。 - 如果
b == "right on"
:- 若
flag == 0
,则遍历hash
数组(从 到 )。对于每个数字i
,若i < a
且hash[i] == 1
,或者i > a
且hash[i] == -1
,或者i == a
且hash[i] != 0
,则将flag
赋值为 ,表示发现作弊。 - 将
flag
的值存入jg
数组中,然后将hash
数组重新初始化为 ,并将flag
重置为 ,准备处理下一轮游戏。
- 若
- 如果
- 使用一个无限循环
- 结果输出:
- 遍历
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
- 上传者