酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

c++实现: 题目描述 最近,在课余时间流行这样一种游戏,游戏的规则如下:游戏开始时,每个人都从规定范围内的数中选取一个数(保证所选取的数各不相同),写在纸上,握在手中(以防让别的同学看见),然后同时打开,如果其中一个同学手中的数是其它任意两位同学手中的数之和,那么他就赢,如果满足条件的有多个,手中的数最大的那位同学赢!这是心理和智力的双重考验,所以参加的学生越来越多,但是,由于参与人数众多,要判断谁赢就成了问题,于是同学们请聪明的你设计一个程序来解决这个问题! 输入格式 第一行为一个整数 N ,表示参加游戏的总人数, 第二行为 N 个数,依次表示 N 个同学所选的数,第 i 个数表示第i位同学所选的数。 输出格式 一个整数,表示那位同学赢,如果没有任何一位同学赢,则输出 “0” 。 样例输入: 5 2 5 7 3 13 样例输出: 3 样例分析 第 3 位同学赢,因为 7=5+2,并且最大 。

我将用C++实现这个游戏判断赢家的程序。程序需要找出一个数,这个数是其他任意两个不同数之和,并且在所有满足条件的数中取最大的那个。 ```cpp #include <iostream> #include <vector> #include <algorithm> #include <unordered_set> using namespace std; int findWinner(const vector<int>& nums) { unordered_set<int> numSet(nums.begin(), nums.end()); vector<int> candidates; for (int i = 0; i < nums.size(); ++i) { bool found = false; // 检查当前数是否可以表示为其他两个不同数的和 for (int j = 0; j < nums.size() && !found; ++j) { if (j == i) continue; int target = nums[i] - nums[j]; if (target != nums[j] && numSet.count(target)) { found = true; } } if (found) { candidates.push_back(nums[i]); } } if (candidates.empty()) { return 0; } // 返回最大的候选数在原数组中的位置(1-based) int maxNum = *max_element(candidates.begin(), candidates.end()); for (int i = 0; i < nums.size(); ++i) { if (nums[i] == maxNum) { return i + 1; // 返回1-based索引 } } return 0; } int main() { int N; cin >> N; vector<int> nums(N); for (int i = 0; i < N; ++i) { cin >> nums[i]; } int winner = findWinner(nums); cout << winner << endl; return 0; } ``` 代码说明: 1. 使用哈希集合存储所有数字以便快速查找 2. 遍历每个数字,检查是否能表示为其他两个不同数字的和 3. 收集所有满足条件的数字 4. 从候选数字中找出最大的那个,返回其在原数组中的位置(1-based索引) 5. 如果没有满足条件的数字,返回0 三条额外需要注意的逻辑点: - 需要确保三个数都是不同的,即不能把一个数用两次来求和 - 当多个数满足条件时,要选择最大的那个数 - 返回的是1-based索引而不是0-based索引 [2025-06-20 16:18:09 | AI写代码神器 | 506点数解答]

相关提问