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

c++描述 小小李老师喜欢玩一种数字游戏 —— 给数组添加一个排列,然后找出出现次数最多的元素。 最近,他找到了一个数组 a,并决定找出在给数组 a 添加某个排列后,他可以获得的数组中相同数字的最大数量。 更正式地说,小小李老师必须选择 n 的 任意一个 全排列 p1、p2、p3 …… pn,然后根据规则给 a 数组的每一项加上全排列对应的数字,即 ai = ai + pi,这样做会改变数组 a 的元素。之后,找出 a 数组中出现次数最多的元素,它的出现次数就是得分。 你需要帮助小小李老师,让他获得最高的得分。 长度为 n 的全排列是由 1 到 n 的 n 个不同整数以任意顺序组成的数组。 例如当 n = 5 时,[2,3,1,5,4] 是一个全排列,但 [1,2,2] 不是一个全排列,[1,3,4] 也不是一个全排列。 输入描述 每个测试包含多个测试用例 第一行包含一个整数 t(1 ≤ t ≤ 100) —— 测试用例的数量 每个测试用例的第一行包含一个整数 n(1 ≤ n ≤ 10006)—— 数组 a 的长度 每个测试用例的第二行包含 n 个整数 ai(1 ≤ ai ≤ 1000

问题分析 我们需要找到一个排列 `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)`,可以接受。 [2025-03-26 17:08:11 | AI写代码神器 | 901点数解答]

实用工具查看更多
【推广】99元上云[开发类] [开发类]
阿里云99元2核2G服务器/年,199元2核4G服务器随心买。
5000人使用进入
[开发类] 在线随机密码生成器[开发类]
生成随机密码,同时返回MD5、Base64、二进制和16进制格式。
100万人使用进入
[开发类] Jquery在线手册[开发类]
能迅速查询各类Jquery方法的详细使用说明与示例代码,适合新手探索Jquery的基础操作,也适合经验丰富的开发者进行复杂功能的实现,极大提升开发效率与质量。
20万人使用进入
[开发类] Linux在线手册[开发类]
linux系统各个命令的详细解释和示例
15万人使用进入
[生活类] 今日油价[生活类]
全国各省油价,实时更新。
1000万人使用进入
[学习类] 英语单词速记[学习类]
可进行单词速记、听音填词、生词本练习,提升英语单词学习效率。
5万人使用进入
法定退休年龄计算器[生活类] [生活类]
直连人力资源和社会保障政务服务平台的法定退休年龄计算器。
1000万人使用进入
[开发类] IntelliJ IDEA下载地址[开发类]
IntelliJ IDEA正版极速下载。
200万人使用进入
热门AI查看更多
“AI写代码神器”擅长各种语言编程、解释代码、注解补充。 在这里填写你的问题。如:写出java冒泡排序算法。
一个入口掌握所有。 在这输入任何问题,或者要AI输出的内容。
AI生成新闻评论。 在这里填入新闻内容。
AI生成内容摘要。 在此处填入需要生成摘要的内容,还可以输入4000字。
AI生成主持词,擅长团建、年会、婚礼、节日等场合的主持词编写。 在这里填入主持场景,如:运动会
AI快速生成周报、月报、日报、年终总结等各类总结报告。 在这里简单输入工作目标、指标、成果,没有任何格式或特殊需求。如:计划年销售业绩1000万,实际完成800万。
将阿拉伯数字转为人明币大写,如:数字1000转换为壹仟。
AI生成爆文标题,能够快速创作出极具吸引力的标题,促使短视频、自媒体文章的点击率与阅读量迅猛攀升。 此处填写一个原始标题,如:一般人怎样打理自身的社交圈?
极速在线生成证件照
极速更换证件照红、蓝、白底色
相关提问