codeforces 166C Median 中位数

#113 div2

题意:给n个数的序列,问最少添加多少个数字,使得序列的中位数是m?


暴力排序,首先注意如果序列里没有m那么添加一个m是必须的,然后就是对于每个m,判断其前后分别有多少个数字,通过计算要加几个数字来把当前数字推到中位数位置


#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define rep(i, j, k) for (int i = j; i <= k; i++)

using namespace std;

int n, p, a[1000];

int main ()
{
	cin >> n >> p;
	rep (i, 1, n)
		scanf ("%d", &a[i]);
	int have = 0;
	rep (i, 1, n)
		have |= (a[i] == p);
	if (have == 0)
		a[++n] = p;
	sort (a + 1, a + 1 + n);
	int l = 0, r = 0, ans = 0x7fffffff;
	rep (i, 1, n)
		if (a[i] == p)
		{
			l = i;
			break;
		}
	for (int i = n; i >= 1; i--)
		if (a[i] == p)
		{
			r = i;
			break;
		}
	if (a[(n + 1) / 2] == p)
	{
		cout << 0 + (have == 0)<< endl;
		return 0;
	}
	rep (i, l, r)
	{
		int left = i - 1, right = n - i;
		//printf ("%d == %d %d\n", i, left, right);
		if (left < right)
			ans = min (ans, right - left - 1);
		else
			ans = min (ans, left - right);
	}
	cout << ans + (have == 0) << endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值