小明的老师准备组织一次班级活动。班上一共有 n 名(n 为偶数)同学, 老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 。 老师希望通过更改若干名同学的 id 使得对于任意一名同学 i,有且仅有另一名同学 j 的 id 与其相同() 。请问老师最少需要更改多少名同学的 id? 输入 输入共 2 行。 第一行为一个正整数 n。 第二行为 n 个由空格隔开的整数 a1, a2, ..., an。 数据范围: 对于 20% 的数据,保证 。 对于 100% 的数据,保证 。 输出 输出共 1 行,一个整数 样例输入 复制 4 1 2 2 3 样例输出 复制 1 提示 仅需要把 a1 改为 3 或者把 a3 改为 1 即可。
题意理解 n 名学生,每名学生有一个正整数 id(范围在 n 以内)。 目标:通过修改一些学生的 id,使得最终每个 id 恰好出现两次(即 n/2 个不同的 id,每个 id 恰好对应 2 名学生)。 问最少修改多少名学生的 id。 --- 思路分析 1. 最终状态:有 n/2 个不同的 id,每个 id 出现 2 次。 2. 当前状态:统计每个 id 出现的次数。 3. 修改学生 id 相当于: - 减少某些 id 的出现次数(把多出来的学生改成别的 id)。 - 增加某些 id 的出现次数(把别的学生改成这个 id)。 等价于: - 设最终保留的 id 集合为 S,|S| = n/2。 - 对于每个最终保留的 id,它当前可能已经有若干学生拥有它,如果当前拥有它的学生数 ≤ 2,则只需补足到 2 个;如果 > 2,则必须把多出的学生改成别的 id。 - 最终保留的 id 从当前已有的 id 中选择一部分,不足 n/2 个时,可以引入新的 id(1~n 中未出现的 id)。 --- 贪心策略 1. 统计每个 id 出现的次数,按出现次数从大到小排序。 2. 优先保留出现次数多的 id(因为保留它们可以减少修改次数)。 3. 最终保留 n/2 个 id,每个 id 最终要有 2 个学生。 对于每个保留的 id: - 如果当前有 c 个学生,c ≥ 2,则保留 2 个,多出的 c-2 个学生必须修改 id。 - 如果 c = 1,则保留 1 个,还需要 1 个学生改成这个 id。 - 如果 c = 0,则这个 id 是新增的,需要 2 个学生改成这个 id。 4. 计算最少修改数: 设当前有 m 个不同的 id(m ≤ n)。 我们选择保留 k 个已有的 id(k ≤ n/2),那么新增的 id 数量 = n/2 - k。 对于保留的 id,如果它的当前数量为 c,则它贡献的修改数 = max(0, c-2)(多出的要改走) + max(0, 2-c)(不足的要补来)。 但注意:补来的学生从哪里来?从那些被改走的学生中来。 所以更简单的计算方式: - 总共有 n 个学生。 - 最终每个保留的 id 有 2 个学生,所以最终保留的学生总数 = n(显然)。 - 对于每个最终保留的 id,如果当前有 c 个学生,则至少保留 min(c, 2) 个学生不动,其余学生要改成别的 id 或者从别的 id 改过来。 换个角度: 最少修改数 = n - (最多可以保留不动的学生数)。 最多可以保留不动的学生数 = 对每个最终保留的 id,最多保留 min(c, 2) 个学生不动。 所以我们要选择 n/2 个 id(可以重复吗?不行,id 必须不同),使得 sum(min(c_i, 2)) 最大。 因为 min(c_i, 2) ≤ 2,所以每个 id 最多贡献 2 个不动的学生。 我们要选 n/2 个 id,所以最大不动的学生数 ≤ n。 具体选法:优先选那些 c_i ≥ 2 的 id,因为它们可以贡献 2 个不动的学生;如果不够 n/2 个,再选 c_i = 1 的 id,贡献 1 个不动的学生。 设: - cnt2 = 当前出现次数 ≥ 2 的 id 数量(每个这样的 id 可以贡献 2 个不动的学生)。 - cnt1 = 当前出现次数 = 1 的 id 数量(每个这样的 id 可以贡献 1 个不动的学生)。 - 其他出现次数 = 0 的 id 可以贡献 0 个不动的学生。 我们要选 n/2 个 id: 如果 cnt2 ≥ n/2,则我们选 n/2 个出现次数 ≥ 2 的 id,每个贡献 2 个不动的学生,所以不动的学生数 = 2*(n/2) = n,修改数 = 0(但可能吗?如果 cnt2 ≥ n/2 且每个 id 出现次数 ≥ 2,但总人数可能超过 n?不会,因为总人数固定 n,如果 cnt2 ≥ n/2,每个至少 2 人,总人数至少 2*(n/2)=n,所以恰好每个 id 出现 2 次,已经满足条件,修改数 0)。 如果 cnt2 < n/2,则我们先选所有 cnt2 个 id(贡献 2*cnt2 个不动的学生),还需要选 (n/2 - cnt2) 个 id,从 cnt1 中选,每个贡献 1 个不动的学生。 所以不动的学生数 = 2*cnt2 + min(cnt1, n/2 - cnt2)。 修改数 = n - [2*cnt2 + min(cnt1, n/2 - cnt2)]。 注意:如果 cnt1 < n/2 - cnt2,则我们还需要选一些出现次数 0 的 id,它们贡献 0 个不动的学生。 --- 举例验证 样例:n=4, ids=[1,2,2,3] 统计: id=1 出现 1 次 → cnt1=1 id=2 出现 2 次 → cnt2=1 id=3 出现 1 次 → cnt1=2 所以 cnt2=1, cnt1=2。 n/2=2。 cnt2=1 < 2,所以不动的学生数 = 2*1 + min(2, 2-1) = 2 + 1 = 3。 修改数 = 4 - 3 = 1。符合样例输出。 --- 算法步骤 1. 读入 n 和数组 a。 2. 统计每个 id 的出现次数(id 范围 1~n,因为题目说 n 以内的正整数)。 3. 计算 cnt2 = 出现次数 ≥ 2 的 id 数量,cnt1 = 出现次数 = 1 的 id 数量。 4. 计算不动学生数: if cnt2 >= n/2: 不动 = n else: 不动 = 2*cnt2 + min(cnt1, n/2 - cnt2) 5. 输出 n - 不动。 --- 代码实现 ```python n = int(input()) a = list(map(int, input().split())) # 统计出现次数 freq = [0] * (n + 1) for x in a: freq[x] += 1 cnt2 = 0 cnt1 = 0 for i in range(1, n + 1): if freq[i] >= 2: cnt2 += 1 elif freq[i] == 1: cnt1 += 1 half = n // 2 if cnt2 >= half: unchanged = n else: unchanged = 2 * cnt2 + min(cnt1, half - cnt2) print(n - unchanged) ``` [2026-01-13 17:49:24 | AI问答 | 1692点数解答]
- [DeepSeek] 小明的老师准备组织一次班级活动。班上一共有 n 名(n 为偶数)同学, 老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 𝑎 𝑖 。 老师希望通过更改若干名同学的 id 使得对于任意一名同学 i,有且仅有另一名同学 j 的 id 与其相同() ( 𝑎 𝑖 = 𝑎 𝑗 ) 。请问老师最少需要更改多少名同学的 id? 输入 输入共 2 行。 第一行为一个正整数 n。 第二行为 n 个由空格隔开的整数 a1, a2, ..., an。 数据范围: 对于 20% 的数据,保证 𝑛 ≤ 10 3 。 对于 100% 的数据,保证 𝑛 ≤ 10 5 。 输出 输出共 1 行,一个整数 样例输入 复制 4 1 2 2 3 样例输出 复制 1 提示 仅需要把 a1 改为 3 或者把 a3 改为 1 即可。(1604点数解答 | 2026-01-11 13:28:28)38
- [DeepSeek] 小明的老师准备组织一次班级活动。班上一共有 n 名(n 为偶数)同学, 老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 。 老师希望通过更改若干名同学的 id 使得对于任意一名同学 i,有且仅有另一名同学 j 的 id 与其相同() 。请问老师最少需要更改多少名同学的 id? 输入 输入共 2 行。 第一行为一个正整数 n。 第二行为 n 个由空格隔开的整数 a1, a2, ..., an。 数据范围: 对于 20% 的数据,保证 。 对于 100% 的数据,保证 。 输出 输出共 1 行,一个整数 样例输入 复制 4 1 2 2 3 样例输出 复制 1 提示 仅需要把 a1 改为 3 或者把 a3 改为 1 即可。(2266点数解答 | 2026-01-13 17:47:37)25
- [DeepSeek] 小明的老师准备组织一次班级活动。班上一共有 n 名(n 为偶数)同学, 老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 。 老师希望通过更改若干名同学的 id 使得对于任意一名同学 i,有且仅有另一名同学 j 的 id 与其相同() 。请问老师最少需要更改多少名同学的 id? 输入 输入共 2 行。 第一行为一个正整数 n。 第二行为 n 个由空格隔开的整数 a1, a2, ..., an。 数据范围: 对于 20% 的数据,保证 。 对于 100% 的数据,保证 。 输出 输出共 1 行,一个整数 样例输入 复制 4 1 2 2 3 样例输出 复制 1 提示 仅需要把 a1 改为 3 或者把 a3 改为 1 即可。(1692点数解答 | 2026-01-13 17:49:24)24
- [字节豆包] 题目描述 最近有 n 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 m 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。 输入格式 第一行有两个用空格隔开的整数,分别代表 n 和 m。 第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数 a i 代表第 i 件事的刺痛值 a i 。 输出格式 输出一行一个整数,表示连续 m 个刺痛值的和的最小值是多少。 输入输出样例 输入 #1复制 8 3 1 4 7 3 1 2 4 3 输出 #1复制 6 说明/提示 数据规模与约定 对于 30% 的数据,保证 n≤20。 对于 60% 的数据,保证 n≤100。 对于 90% 的数据,保证 n≤10 3 。 对于 100% 的数据,保证 0≤m≤n≤3×10 3 ,1≤a i ≤100。 用c++语言(241点数解答 | 2025-11-24 19:52:43)66
- [字节豆包] 题目描述 现在给出一排共 n 只鹅的身高,李白想知道最高的鹅比其他所有鹅高多少、最矮的鹅 比其他所有鹅矮多少。 请输出这两行信息。 输入格式 输入共两行。 第一行一个整数 n 表示鹅的数目。 第二行共 n 个整数 ai(i=1,2,3...n),表示第 i 只鹅的身高。 输出格式 输出共两行。 第一行共 n 个空格隔开的整数,第 i 个整数表示序列中第 i 只鹅比最高的那只鹅要 矮多少。 第二行共 n 个空格隔开的整数,第 i 个整数表示序列中第 i 只鹅比最矮的那只鹅要 高多少。 输入输出样例 输入 #1 6 4 7 8 6 3 2 输出 #1 4 1 0 2 5 6 2 5 6 4 1 0 说明/提示 李白一共有 6 只鹅,最高的一只身高为 8,最矮的一只身高为 2,然后分别作为被减 数和减数参与身高差计算可得结果。 对于 30% 数据,保证 0≤ai≤30,1≤n≤20。 对于 100% 数据,保证 0≤ai≤1018,1≤n≤106。 用c++语言(549点数解答 | 2025-11-16 20:19:06)53
- [GPT] 用c语言链表合并。题目描述 题目内容:已知单链表la=(a1, a2 .…, am)和lb=(b1, b2.…, bn),编写程序按以下规则将它们合并成一个单链表lc,要求新表c利用原表的存储空间。 lc=(a1, b1. .…, am, bm, bm+1., bn), m<=n 或者 lc=(a1, b1. …, bn, an, an+1. …, am), m> 输入格式:一行内输入单链表la中的数据(若干个正整数,之间用空格隔开,并以1结束)一行内输入单链表lb的数据(若干个正整数,之间用空悄隔开,并以1结束) 输出格式:一行内输出合并后单链表lc的数据结果,之间用两个分隔符·…隔开,结束标志·1不输出。 输入样例:13 57-1 246-1 输出样例:-1-2-34--5-6-7 则试用例 用例1 分致:20 描误提示 用例2 分数:20 错误提示; 题目运行时间限制:500ms 题目运行内存限制:32000kb(1020点数解答 | 2024-06-17 15:01:02)306
- [字节豆包] [{id:1,src:'/1.jpg'},{id:2,src:'null'},{id:3,src:'/2.jpg'},{id:4,src:'null'},{id:5,src:'/3.jpg'},{id:6,src:'null'}] js转换[{id:1,src:'/1.jpg'},{id:2,src:'/2.jpg'},{id:3,src:'/3.jpg'},{id:4,src:'null'},{id:5,src:'{id:4,src:'null'},'},{id:6,src:'null'}](680点数解答 | 2025-08-04 17:09:03)177
- [字节豆包] 给定长度为 n 的序列 a1,a2,⋯,an 。 你需要回答多次询问,每次询问会给出一个数字 k ,请问序列中所有数字或 k 之和减去所有数字与 k 之和是多少,即求 ∑ni=1ai|k−∑ni=1ai&k 。 输入格式 第一行输入一个整数 n 。 第二行输入 n 个整数 a1,a2,⋯,an 。 第三行输入一个整数 q ,表示询问次数。 接下来 q 行,每行输入一个整数 k 。 输出格式 对于每次询问,输出一行一个整数,表示答案。 样例输入 5 1 2 3 4 5 5 1 2 3 4 5 样例输出 14 17 16 19 18 数据范围 对于 30% 的数据,保证 n,q≤1000 。 对于 100% 的数据,保证 1≤n,q≤5×105,1≤ai,k≤109 。 用C++xie(232点数解答 | 2025-01-08 19:10:29)454
- [字节豆包] 给定长度为 n 的序列 a1,a2,⋯,an 。 你需要回答多次询问,每次询问会给出一个数字 k ,请问序列中所有数字或 k 之和减去所有数字与 k 之和是多少,即求 ∑ni=1ai|k−∑ni=1ai&k 。 输入格式 第一行输入一个整数 n 。 第二行输入 n 个整数 a1,a2,⋯,an 。 第三行输入一个整数 q ,表示询问次数。 接下来 q 行,每行输入一个整数 k 。 输出格式 对于每次询问,输出一行一个整数,表示答案。 样例输入 5 1 2 3 4 5 5 1 2 3 4 5 样例输出 14 17 16 19 18 数据范围 对于 30% 的数据,保证 n,q≤1000 。 对于 100% 的数据,保证 1≤n,q≤5×105,1≤ai,k≤109 。 用C++xie(244点数解答 | 2025-01-08 19:10:30)282
- [字节豆包] 给定长度为 n 的序列 a1,a2,⋯,an 。 你需要回答多次询问,每次询问会给出一个数字 k ,请问序列中所有数字或 k 之和减去所有数字与 k 之和是多少,即求 ∑ni=1ai|k−∑ni=1ai&k 。 输入格式 第一行输入一个整数 n 。 第二行输入 n 个整数 a1,a2,⋯,an 。 第三行输入一个整数 q ,表示询问次数。 接下来 q 行,每行输入一个整数 k 。 输出格式 对于每次询问,输出一行一个整数,表示答案。 样例输入 5 1 2 3 4 5 5 1 2 3 4 5 样例输出 14 17 16 19 18 数据范围 对于 30% 的数据,保证 n,q≤1000 。 对于 100% 的数据,保证 1≤n,q≤5×105,1≤ai,k≤109 。 用C++(不要O(nq)复杂度) (534点数解答 | 2025-10-17 20:05:07)44
- [字节豆包] 给定长度为 n 的序列 a1,a2,⋯,an 。 你需要回答多次询问,每次询问会给出一个数字 k ,请问序列中所有数字或 k 之和减去所有数字与 k 之和是多少,即求 ∑ni=1ai|k−∑ni=1ai&k 。 输入格式 第一行输入一个整数 n 。 第二行输入 n 个整数 a1,a2,⋯,an 。 第三行输入一个整数 q ,表示询问次数。 接下来 q 行,每行输入一个整数 k 。 输出格式 对于每次询问,输出一行一个整数,表示答案。 样例输入 5 1 2 3 4 5 5 1 2 3 4 5 样例输出 14 17 16 19 18 数据范围 对于 30% 的数据,保证 n,q≤1000 。 对于 100% 的数据,保证 1≤n,q≤5×10^5,1≤ai,k≤10^9 。 用C++xie (410点数解答 | 2025-10-17 20:05:52)49
- [字节豆包] 田忌赛马 内存限制: 256 Mb时间限制: 1000 ms 题目描述 田忌和齐王各有 n n 匹马,田忌的马速度分别为 a 1 , a 2 , … , a n a1,a2,…,a n ,而齐王的马速度分别为 b 1 , b 2 , … , b n b1,b2,…,b n 。 田忌与齐王比赛 n n 轮,双方每轮挑出一匹新马,若田忌的马更快,田忌加一分,若齐王的马更快,齐王加一分,若双方速度一样,分数不变。 齐王永远按照固定的顺序选择马匹参赛,田忌应该采取什么策略才能让自己的得分减齐王的得分变得最大? 输入格式 第一行:单个整数 n n 第二行: n n 个整数 a 1 , a 2 , … , a n a1,a2,…,a n 第三行: n n 个整数 b 1 , b 2 , … , b n b1,b2,…,b n 输出格式 单个整数:表示田忌得分减齐王得分的最大值 数据范围 对于 30 % 30% 的数据, n ≤ 20 n≤20 对于 60 % 60% 的数据, n ≤ 2000 n≤2000 对于 100 % 100(567点数解答 | 2025-08-29 11:43:43)125