C++助力小小李老师:破解数组排列数字游戏最高得分之谜
问题分析 我们需要找到一个排列 `p`,使得将数组 `a` 的每个元素 `a_i` 加上 `p_i` 后,新数组中某个元素的出现次数最大化。排列 `p` 是 `1` 到 `n` 的一个排列。 关键观察 1. 排列的性质:排列 `p` 是 `1` 到 `n` 的一个排列,因此 `p` 的所有元素之和是固定的(即 `n(n+1)/2`),但具体的排列方式可以自由选择。 2. 目标:我们需要让尽可能多的 `a_i + p_i` 的值相同。换句话说,我们需要找到一个目标值 `x`,使得尽可能多的 `a_i + p_i = x`。 3. 策略:对于每个 `a_i`,我们可以选择一个 `p_i` 使得 `a_i + p_i` 等于某个目标 `x`。为了最大化相同 `x` 的数量,我们需要选择一个 `x` 使得尽可能多的 `(x - a_i)` 落在 `1` 到 `n` 的范围内且互不相同。 解题步骤 1. 排序数组 `a`:将数组 `a` 排序可以方便我们选择 `p_i`。 2. 贪心选择:对于排序后的 `a`,我们可以尝试让尽可能多的 `a_i + p_i` 等于某个 `x`。具体来说,我们可以尝试让 `x` 尽可能小或尽可能大,以覆盖更多的 `a_i`。 3. 统计频率:对于每个可能的 `x`,统计有多少 `a_i` 可以满足 `x - a_i` 在 `1` 到 `n` 的范围内且不重复。 代码实现 ```cpp #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int solve() { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } sort(a.begin(), a.end()); unordered_map<int, int> freq; for (int i = 0; i < n; ++i) { int p = i + 1; // 1-based index int x = a[i] + p; freq[x]++; } int max_count = 0; for (auto& [x, count] : freq) { if (count > max_count) { max_count = count; } } return max_count; } int main() { int t; cin >> t; while (t--) { cout << solve() << endl; } return 0; } ``` 代码解释 1. 输入处理:读取测试用例的数量 `t`,然后对于每个测试用例,读取数组 `a` 的长度 `n` 和数组 `a` 的元素。 2. 排序数组:将数组 `a` 排序,以便后续贪心选择。 3. 频率统计:对于每个 `a_i`,计算 `x = a_i + p_i`(其中 `p_i` 是 `1` 到 `n` 的排列),并统计每个 `x` 的出现次数。 4. 找出最大频率:遍历频率统计结果,找出出现次数最多的 `x` 的出现次数。 5. 输出结果:对于每个测试用例,输出最大频率。 额外需要注意的逻辑点 1. 排列的唯一性:确保 `p_i` 是 `1` 到 `n` 的一个排列,因此 `p_i` 必须互不相同且在 `1` 到 `n` 的范围内。 2. 贪心策略的正确性:排序后选择 `p_i = i + 1` 可以最大化相同 `x` 的数量,因为这样可以让 `x` 尽可能均匀分布。 3. 时间复杂度:排序的时间复杂度是 `O(n log n)`,统计频率的时间复杂度是 `O(n)`,因此总时间复杂度是 `O(n log n)`,可以接受。 ######[AI写代码神器 | 901点数解答 | 2025-03-26 17:08:11]
- 超燃年会来袭!诗舞歌戏轮番上阵,共赴欢乐盛宴! (字节豆包 | 206点数解答 | 2025-01-08 10:59:43)343
- 深入解析格雷码生成算法:递归求解与代码实现(DeepSeek | 443点数解答 | 2026-01-05 12:21:49)49
- C++ 实现:精准统计给定范围 [L, R] 内数字 2 出现的次数及代码详解(字节豆包 | 401点数解答 | 2026-02-05 21:17:05)38
- C++实现:统计[L, R]范围内数字2出现的次数及代码详解(字节豆包 | 489点数解答 | 2026-02-07 17:12:26)43
- Python:用正则表达式从含多种字符的字符串中提取英文、数字和中文单词(GPT | 522点数解答 | 2024-05-31 19:05:27)313
- Python:用正则表达式结合 split 思路提取一行字符串中的英文、数字和中文单词 (GPT | 399点数解答 | 2024-05-31 19:07:31)311
- 繁体字编码代码修改:人物名字合法性验证函数转简体版(字节豆包 | 325点数解答 | 2024-10-21 18:57:01)286
- 计算区间 n 到 m 中数字 x 出现次数的 Python 实现与详解(字节豆包 | 289点数解答 | 2025-12-07 17:14:59)72
- Python 实现:计算区间 n 到 m 中数字 x 出现的次数(字节豆包 | 322点数解答 | 2025-12-13 21:37:08)74
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)13
- 功夫忍者挑战代码优化建议与逻辑要点揭秘(字节豆包 | 171点数解答 | 2025-03-08 21:40:11)210
- 2025年截止提交项目得零分!C语言五大错误深度剖析与解决方案 (字节豆包 | 857点数解答 | 2025-07-10 21:26:21)170