Codeforces Round 936 (Div. 2) - A. Median of an Array (数学)

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} p2k ,其中 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 1in ),并在一次操作中将 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 1t104 ) - 测试用例的数量。然后是测试用例的描述。

每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105 ) - 数组 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 1ai109 ) - 数组 a a a

保证所有测试用例中 n n n 的值之和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2105

输出

对于每个测试用例,输出一个整数 - 增加数组中位数所需的最少操作数。


在排序之后,位于 ⌈ 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;
}
  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值