酷代码 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 ≤

问题分析 我们需要找到一个排列 `p`,使得在将数组 `a` 的每个元素 `a_i` 加上排列 `p` 的对应元素 `p_i` 后,新数组中某个元素的出现次数最大化。我们的目标是找到这个最大出现次数。 关键观察 1. 排列的性质:排列 `p` 是 `1` 到 `n` 的一个排列,即 `p` 包含 `1` 到 `n` 的每个数字恰好一次。 2. 新数组的元素:新数组的元素为 `a_i + p_i`。我们需要选择一个 `p` 使得尽可能多的 `a_i + p_i` 相同。 3. 最大化相同元素的策略:为了使 `a_i + p_i` 相同,我们需要让 `a_i + p_i` 的值尽可能集中。这可以通过将 `a` 和 `p` 的排序方式结合起来实现。 解决思路 1. 排序:将数组 `a` 和排列 `p` 分别排序。排序 `a` 为升序,排序 `p` 为降序(或反之),这样可以最大化 `a_i + p_i` 的相同值的可能性。 - 具体来说,将 `a` 升序排列,`p` 降序排列(即 `p` 是 `n, n-1, ..., 1`),这样 `a_i + p_i` 的值会尽可能集中在某个范围内。 2. 统计频率:计算 `a_i + p_i` 的值,并统计每个值的出现频率。 3. 最大频率:找到频率的最大值,即为答案。 为什么这样排序? - 如果我们不排序 `a` 和 `p`,`a_i + p_i` 的值会分散,难以形成相同的值。 - 将 `a` 升序和 `p` 降序排列后,`a_i + p_i` 的值会尽可能集中在中间值附近,从而增加相同值的概率。 算法步骤 1. 对于每个测试用例: - 读取 `n` 和数组 `a`。 - 将 `a` 排序为升序。 - 构造排列 `p` 为 `n, n-1, ..., 1`(即降序排列)。 - 计算 `a_i + p_i` 的所有值。 - 统计这些值的频率,找到最大频率。 - 输出最大频率。 示例验证 以第一个测试用例为例: - 输入: ``` 2 1 2 ``` - 排序 `a` 为 `[1, 2]`。 - 排列 `p` 为 `[2, 1]`。 - `a_i + p_i` 为 `[1+2, 2+1] = [3, 3]`。 - 频率统计:`3` 出现 `2` 次。 - 输出 `2`,与示例一致。 代码实现 ```cpp #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int main() { int t; cin >> t; while (t--) { 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; int max_freq = 0; for (int i = 0; i < n; ++i) { int val = a[i] + (n - i); // p_i = n, n-1, ..., 1 freq[val]++; if (freq[val] > max_freq) { max_freq = freq[val]; } } cout << max_freq << endl; } return 0; } ``` 代码解释 1. 输入处理:读取测试用例数量 `t`。 2. 循环处理每个测试用例: - 读取 `n` 和数组 `a`。 - 对 `a` 进行升序排序。 - 使用哈希表 `freq` 统计 `a_i + p_i` 的频率,其中 `p_i` 是 `n - i`(即 `p` 是 `n, n-1, ..., 1`)。 - 在统计过程中更新最大频率 `max_freq`。 3. 输出结果:对于每个测试用例,输出 `max_freq`。 额外注意的逻辑点 1. 排列的构造:排列 `p` 是 `n, n-1, ..., 1`,这是为了与排序后的 `a` 配合最大化相同值的出现。 2. 排序的必要性:必须对 `a` 排序才能确保 `a_i + p_i` 的值集中,否则无法保证最大频率。 3. 哈希表的使用:使用哈希表统计频率是因为值的范围可能很大,直接数组统计不现实。 [2025-03-25 21:11:51 | AI写代码神器 | 1118点数解答]

实用工具查看更多
【推广】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生成爆文标题,能够快速创作出极具吸引力的标题,促使短视频、自媒体文章的点击率与阅读量迅猛攀升。 此处填写一个原始标题,如:一般人怎样打理自身的社交圈?
极速在线生成证件照
极速更换证件照红、蓝、白底色
相关提问