A
.
M
e
d
i
a
n
o
f
a
n
A
r
r
a
y
A. Median of an Array
A.MedianofanArray
t
i
m
e
l
i
m
i
t
p
e
r
t
e
s
t
:
1
s
e
c
o
n
d
time limit per test: 1 second
timelimitpertest:1second
m
e
m
o
r
y
l
i
m
i
t
p
e
r
t
e
s
t
:
256
m
e
g
a
b
y
t
e
s
memory limit per test: 256 megabytes
memorylimitpertest:256megabytes
i
n
p
u
t
:
s
t
a
n
d
a
r
d
i
n
p
u
t
input: standard input
input:standardinput
o
u
t
p
u
t
:
s
t
a
n
d
a
r
d
o
u
t
p
u
t
output: standard output
output:standardoutput
给你一个由 n n n 个整数组成的数组 a a a 。
数组 q 1 , q 2 , … , q k q_1, q_2, \ldots, q_k q1,q2,…,qk 的中位数是 p ⌈ k 2 ⌉ p_{\lceil \frac{k}{2} \rceil} p⌈2k⌉ ,其中 p p p 是按非递减顺序排序的数组 q q q 。例如,数组 [ 9 , 5 , 1 , 2 , 6 ] [9, 5, 1, 2, 6] [9,5,1,2,6] 的中位数是 5 5 5 ,如在排序数组 [ 1 , 2 , 5 , 6 , 9 ] [1, 2, 5, 6, 9] [1,2,5,6,9] 中,索引 ⌈ 5 2 ⌉ = 3 \lceil \frac{5}{2} \rceil = 3 ⌈25⌉=3 处的数字是 5 5 5 ;数组 [ 9 , 2 , 8 , 3 ] [9, 2, 8, 3] [9,2,8,3] 的中位数是 3 3 3 ,如在排序数组 [ 2 , 3 , 8 , 9 ] [2, 3, 8, 9] [2,3,8,9] 中,索引 ⌈ 4 2 ⌉ = 2 \lceil \frac{4}{2} \rceil = 2 ⌈24⌉=2 处的数字是 3 3 3 。
您可以选择一个整数 i i i ( 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n ),并在一次操作中将 a i a_i ai 增加 1 1 1 。
你的任务是找出增加数组中位数所需的最少操作次数。
注意数组 a a a 不一定包含不同的数。
输入
每个测试由多个测试用例组成。第一行包含一个整数 t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1≤t≤104 ) - 测试用例的数量。然后是测试用例的描述。
每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1≤n≤105 ) - 数组 a a a 的长度。
每个测试用例的第二行包含 n n n 个整数 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,…,an ( 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1≤ai≤109 ) - 数组 a a a 。
保证所有测试用例中 n n n 的值之和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2⋅105 。
输出
对于每个测试用例,输出一个整数 - 增加数组中位数所需的最少操作数。
在排序之后,位于 ⌈ n 2 ⌉ \lceil\frac{n}{2}\rceil ⌈2n⌉ 下标处的数就被认为是中位数,暂时使这个下标为 p p p ,如果想要改变中位数的数值,那么就要使得 p p p 下标之后的数都满足大于或者等于 a [ p ] a[p] a[p] ,因为只有这样才能够满足数组的有序顺序不会改变。
所以直接先取出中位下标然后取扫后面有多少数和中位数相等。
不用管大于中位数的数是因为,就算中位数加
1
1
1 了之后他们也是大于等于中位数,不会影响整体顺序。
代码:
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int a[N];
void solve(){
int n;cin >> n;
for(int i = 1;i <= n;i++)cin >> a[i];
int mid = (n+1)/2;//取出中位下标
int res = 1;//先提前加上中位数本身应该加的1
for(int i = mid + 1;i <= n;i++){
if(a[i] == a[mid])res++;
}
cout << res << endl;
return;
}
int main(){
int t;cin >> t;
while(t--)
solve();
return 0;
}