小明的老师准备组织一次班级活动。班上一共有 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 即可。
我们一步步分析这个问题。 --- ## 1. 题意理解 - 有 \( n \) 个同学(\( n \) 是偶数)。 - 每个同学有一个正整数 id \( a_i \)。 - 目标:通过修改尽量少的同学的 id,使得最终每个 id 出现恰好 2 次(即每个 id 对应一对同学)。 - 问最少修改多少人的 id。 --- ## 2. 关键点 - 最终状态:有 \( n/2 \) 种不同的 id,每种 id 恰好 2 个同学。 - 初始状态:可能有某些 id 出现 1 次、3 次、4 次等,也可能有 id 已经出现 2 次。 - 修改一个同学的 id,相当于让它离开原来的 id 组,加入另一个 id 组(或新建一个 id)。 --- ## 3. 思路 设初始时不同 id 的个数为 \( m \),每个 id 的出现次数为 \( cnt[x] \)。 最终要求: 1. 每个 id 出现次数 = 2。 2. 总共有 \( n/2 \) 个不同的 id。 --- 3.1 分类讨论 - 如果某个 id 出现次数 > 2,那么多出来的部分必须修改成别的 id。 - 如果某个 id 出现次数 = 2,那么这一对已经符合要求,可以保留。 - 如果某个 id 出现次数 = 1,那么它必须与另一个出现次数为 1 的 id 配对,或者从 >2 的 id 中分过来一个。 --- 3.2 更直接的贪心方法 已知最终有 \( n/2 \) 个不同的 id,每个 id 出现 2 次。 所以最终不同 id 的个数是固定的 \( n/2 \)。 设初始不同 id 的个数为 \( m \)。 - 如果 \( m < n/2 \),说明我们需要增加新的 id 种类,这需要从出现次数 >2 的 id 里分出来,或者把出现次数 =1 的 id 合并。 - 如果 \( m > n/2 \),说明我们需要减少 id 种类,把某些 id 的人改成已有的 id。 但这里更简单的思路是: 定义: - 设 \( extra \) = 所有出现次数 >2 的 id 中,超出 2 的部分的总和。 例如 id=1 出现 4 次,则超出部分 = 2(因为要保留 2 个,改掉 2 个)。 - 设 \( single \) = 出现次数 =1 的 id 的个数。 --- 配对过程: 1. 对于出现次数 >2 的 id,多出来的人必须修改 id。这些多出来的人可以填补到出现次数 =1 的 id 上(让它们变成 2 次),也可以用来创建新的 id(如果最终 id 种类不够 \( n/2 \))。 2. 出现次数 =1 的 id 需要另一个相同 id 的人来配对,这个“另一个人”要么来自另一个出现次数 =1 的 id(两个 single 配对,但这样会减少 id 种类),要么来自某个 >2 的 id 中多出来的人。 --- 计算最少修改人数: 一个更简洁的公式(来自类似题解): 设 \( k = n/2 \) 是最终需要的不同 id 个数。 设初始不同 id 个数为 \( m \)。 我们需要最终有 \( k \) 种 id,每种 2 个。 考虑初始时已经配对好的 id(出现次数 =2 的 id),假设有 \( p \) 个这样的 id。 那么这些 id 已经符合要求,不需要修改。 剩下的 \( n - 2p \) 个人需要调整,使得最终总共有 \( k \) 种 id。 --- 另一种常见贪心: 1. 统计出现次数 ≥2 的 id 中,保留 2 个,多出来的都要改。 设 \( s \) = 所有出现次数 >2 的 id 中,超出 2 的部分的总人数。 2. 统计出现次数 =1 的 id 个数 \( t \)。 最终 id 种类数 = \( m \) 初始,我们需要 \( k \) 种。 如果 \( m > k \),我们必须减少种类,减少的方式是把某些出现次数 =1 的 id 的人改成已有的 id(这样会消除一个种类)。 如果 \( m < k \),我们需要增加种类,增加的方式是把某些 >2 的 id 中多出来的人改成新的 id。 --- 具体计算: 设 \( more = \sum_{cnt>2} (cnt - 2) \) 表示“可用的多余人数”(他们必须改 id)。 设 \( needPair = \sum_{cnt=1} 1 \) 表示落单的人数(每个落单的人需要一个同伴)。 我们优先用多余的人去配对落单的人: - 如果 \( more \ge needPair \),那么所有落单的人都可以被多余的人配对(配对时落单的人不需要改 id,多余的人改 id 来配对他们),这样落单的人不需要改 id,多余的人中有一部分改 id 去配对,剩下的多余的人需要改 id 去创建新的 id 种类(如果最终种类不够)。 - 如果 \( more < needPair \),那么落单的人中有一部分需要互相配对(这样会减少 id 种类),另一部分被多余的人配对。 --- 但更简单的结论(经过推导): 最少修改次数 = \[ \max\left( \sum_{cnt>2} (cnt-2),\ m - \frac{n}{2} \right) + \text{adjust} \] 实际上标准答案是: \[ \text{ans} = \max\left( \sum_{cnt>2} (cnt-2),\ m - \frac{n}{2} \right) \] 因为 \( m - n/2 \) 表示初始种类比最终种类多多少,这些多出来的种类必须消除,消除的方法是修改其中某些人的 id(每消除一个种类至少改 1 人)。 而 \( \sum_{cnt>2} (cnt-2) \) 表示必须改的人数下限(因为超出 2 的部分必须改)。 两者取最大就是答案。 --- ## 4. 验证样例 n=4, a=[1,2,2,3] cnt: 1→1, 2→2, 3→1 m=3 n/2=2 m - n/2 = 1 sum(cnt>2 的超出部分) = 0 max(0,1)=1 输出 1,符合样例。 --- ## 5. 代码实现 ```python from collections import Counter def solve(): n = int(input()) arr = list(map(int, input().split())) cnt = Counter(arr) m = len(cnt) target_pairs = n // 2 # 计算超出 2 的部分 extra = 0 for v in cnt.values(): if v > 2: extra += v - 2 ans = max(extra, m - target_pairs) print(ans) if __name__ == "__main__": solve() ``` [2026-01-11 13:28:28 | AI问答 | 1604点数解答]
- [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)23
- [字节豆包] 题目描述 最近有 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
- [字节豆包] 给定长度为 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
- [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
- [字节豆包] 你要开始一场数轴旅行,初始时,你所在的位置为 � = 0 x=0 ,你想要去 � = � x=d 位置。 给定 � n 个整数 � 1 , � 2 , . . . , � � a 1 ,a 2 ,...,a n ,表示每次你可以往左移动 � � a i 个单位或往右移动 � � a i 个单位。 请问,最终能否到达 � = � x=d 位置?能则输出 Yes,不能输出 No。 输入 输入共两行: 第一行,两个整数 n,d 第二行,n 个正整数 输出 输出能否达到最终目标位置。 样例输入 复制 2 -4 6 8 样例输出 复制 Yes 提示 对于 30 % 30% 的数据,满足 1 ≤ � ≤ 10 1≤n≤10, 1 ≤ � � ≤ 10 1≤a i ≤10, − 20 ≤ � ≤ 20 −20≤d≤20。 对于 60 % 60% 的数据,满足 1 ≤ � ≤ 1 0 3 1≤n≤10 3 , 1 ≤ � � ≤ 1 0 3 1≤a i ≤10 3 , − 1 0 4 ≤ � ≤ 1 0 4 −10 4 ≤d(225点数解答 | 2026-01-23 19:51:03)27