思路
很明显,对于每次操作的两个数
x
x
x 和
y
y
y,只要
x
x
x 的值始终大于等于
y
y
y,那么不管
x
x
x 怎么变化,得分都只会累加
y
y
y,所以想要得分尽可能大,
x
x
x 的取值就要尽可能地接近
y
y
y 且大于等于
y
y
y,而对于任意一个长度为
2
×
n
2\times n
2×n 的升序序列
A
A
A,大于等于
A
i
A_i
Ai 且最接近
A
i
A_i
Ai 的值就为
A
i
+
1
A_{i+1}
Ai+1,所以这
n
n
n 次操作得分最大为:
∑
i
=
1
n
min
(
A
i
×
2
−
1
,
A
i
×
2
)
\sum_{i=1}^{n}\min(A_{i\times2-1},A_{i\times2})
i=1∑nmin(Ai×2−1,Ai×2)
而由于
A
A
A 是一个升序序列,所以
A
i
×
2
−
1
A_{i\times2-1}
Ai×2−1 肯定小于等于
A
i
×
2
A_{i\times2}
Ai×2,所以可以将式子化简成:
∑
i
=
1
n
A
i
×
2
−
1
\sum_{i=1}^{n}A_{i\times2-1}
i=1∑nAi×2−1
故只需要将
a
a
a 进行升序排序,再按照如上计算方式进行计算即可。
Code
核心代码:
while(t--) {
cin>>n,ans=0;
for(int i=1;i<=2*n;++i) cin>>arr[i];
sort(arr+1,arr+1+n*2);//排序
for(int i=1;i<=n;++i) ans+=arr[i*2-1];//套入公式
}
时间复杂度 O ( ∑ n ) \mathcal O(\sum n) O(∑n)。