Median of an Array(贪心策略,编程技巧)

文章目录

题目描述

给你一个由 n n n 个整数组成的数组 a a a 。

数组 q 1 , q 2 , ... , q k q_1,q_2,...,q_k q1,q2,...,qk 的中位数是 p ⌈ k 2 ⌉ p⌈\frac {k}{2}⌉ 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 ⌈\frac {5}{2}⌉=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 ⌈\frac {4}{2}⌉=2 ⌈24⌉=2 处的数字是 3 3 3 。

您可以选择一个整数 i ( 1 ≤ i ≤ n ) i( 1≤i≤n) i(1≤i≤n),并在一次操作中将 a i a_i ai 增加 1 1 1 。

你的任务是找出增加数组中位数所需的最少运算次数。

注意数组 a a a 不一定包含不同的数。

输入格式

第一行包含一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1 \leq n \leq 10^5) n(1≤n≤105)- 数组 a a a 的长度。

第二行包含 n n n 个整数 a 1 , a 2 , . . . , a n ( 1 ≤ a i ≤ 1 0 9 ) a_1,a_2,...,a_n(1 \leq a_i \leq 10^9) a1,a2,...,an(1≤ai≤109) - 数组 a a a 。

输出格式

输出一个整数 - 增加数组中位数所需的最少操作数。

样例输入

cpp 复制代码
3
2 2 8

样例输出

cpp 复制代码
1

提交链接

https://hydro.ac/d/lp728/p/12

提示

样例解释 1 1 1:

对第一个数字进行一次运算,得到数组 [ 3 , 2 , 8 ] [3,2,8] [3,2,8],这个数组的中位数是 3 3 3,因为它是非递减排序数组 [ 2 , 3 , 8 ] [2,3,8] [2,3,8] 中索引 ⌈ 3 2 ⌉ = 2 ⌈\frac {3}{2}⌉=2 ⌈23⌉=2 处的数字。原数组 [ 2 , 2 , 8 ] [2,2,8] [2,2,8] 的中位数是 2 2 2,因为它是非递减排序数组 [ 2 , 2 , 8 ] [2,2,8] [2,2,8] 中索引 ⌈ 3 2 ⌉ = 2 ⌈\frac {3}{2}⌉=2 ⌈23⌉=2 处的数字。因此,只需一次操作,中位数就增加了。 ( 3 > 2 ) (3>2) (3>2)

解析

先对数组进行排序,找出数组中的中位数,即数字 a ⌈ n 2 ⌉ a_{⌈\frac {n}{2}⌉} a⌈2n⌉,让它等于 x x x 。为了使中位数增加,即至少变为 x + 1 x+1 x+1,数组中必须至少有 n − ⌈ n 2 ⌉ + 1 n-⌈\frac {n}{2}⌉+1 n−⌈2n⌉+1 个数字大于或等于 x + 1 x+1 x+1。统计 x x x 的个数即可。

count 函数:统计区间内某个数的个数。

参考代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int t , n;
int main()
{
	int n;
	cin >> n;
	vector<int> v(n);   
	for(int i = 0; i < n; i++)
		cin >> v[i];
	sort(v.begin() , v.end());  //排序 
	int id = (n + 1) / 2 - 1;  //中位数的下标(下标从0输入) 
	int num = count(v.begin() + id , v.end() , v[id]);  //计算v[id]的个数 
	cout << num << endl;
	return 0;
}
相关推荐
Ialand~1 小时前
深度解析 Rust 的数据结构:标准库与社区生态
开发语言·数据结构·rust
Lester_11011 小时前
嵌入式学习笔记 - 用泰勒公式解决 tanh函数
笔记·学习·算法
无限进步_2 小时前
C语言字符串连接实现详解:掌握自定义strcat函数
c语言·开发语言·c++·后端·算法·visual studio
凤年徐2 小时前
HashMap 的哈希算法与冲突解决:深入 Rust 的高性能键值存储
算法·rust·哈希算法
J_Xiong01172 小时前
【VLNs篇】11:Dynam3D: 动态分层3D令牌赋能视觉语言导航中的VLM
人工智能·算法·3d
弈风千秋万古愁2 小时前
【PID】连续PID和数字PID chapter1(补充) 学习笔记
笔记·学习·算法·matlab
天选之女wow2 小时前
【代码随想录算法训练营——Day52】图论——101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
算法·深度优先·图论
碧海银沙音频科技研究院2 小时前
i2s封装成自己定义8路音频数据发送方法
arm开发·人工智能·深度学习·算法·音视频
做科研的周师兄2 小时前
【机器学习入门】9.2:感知机的工作原理 —— 从模型结构到实战分类
人工智能·算法·机器学习·分类·数据挖掘
不去幼儿园3 小时前
【启发式算法】狼群算法(Wolf Pack Algorithm, WPA)算法详细介绍(Python)
python·算法·启发式算法·任务分配·集群智能