思路分析
我们的目标是最大化 ∑vac(i)。由于 vac(i) 的定义依赖于前缀空缺数,并且 vac(i) 序列是非递减的(vac(1)≤vac(2)≤⋯≤vac(n)),我们希望让 vac(i) 的值尽可能早地、尽可能大地增长。
vac(i) 的值等于集合 {x1,…,xi} 中未出现的最小非负整数。为了让 vac(i) 的值变大,我们需要让前缀 {x1,…,xi} 尽可能地包含从 0 开始的连续整数。
- 为了最大化 vac(1),我们应该选择 x1=0(如果给定的元素中有 0 的话)。这样 vac(1)=1。如果选择其他数,vac(1)=0。
- 为了最大化 vac(2),在 x1=0 的基础上,我们应该选择 x2=1(如果给定的元素中有 1 的话)。这样 {x1,x2}={0,1},使得 vac(2)=2。
- 以此类推,为了让 vac(i) 达到最大可能值 i,我们需要让前缀 {x1,…,xi} 恰好是 {0,1,…,i−1}。
题目内容
给定一个长度为 n 的整数序列,你可以将其中的元素重新排列成任意顺序。对于排列后的序列 x1,x2,…,xn,定义第 i 个前缀的 空缺数 为:在前 i 个元素组成的集合中,未出现的最小非负整数,记作 vac(i)。你的目标是最大化所有前缀空缺数的总和 ∑i=1nvac(i)。请输出这个最大总和,并给出一个能达到该值的排列。
约束条件:序列的长度 n 满足 1≤n≤2imes105;序列中的所有元素均为非负整数,且大小不超过 109。
输入描述
第一行输入一个整数 n,表示序列的长度。
第二行输入 n 个整数,表示初始序列中的元素。
输出描述
开通会员即可查看完整视频题解: 1.题目讲解 2.思路分析 3.逐行代码手写