题目链接
给你N个数(N一定为奇数),问题是使得中位数为M,我们应当对与数组上相应的元素减去或加上多少?
二分搜到第一个">=M"的数令作K,假如越界就为N,然后用K和中间值mid比较谁大,进行处理就是了。
期间特判第一个数“N==1”时特判,直接输出其与M的差值就是了,不然会一直WA在第67发。
完整代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef long long ll;
const int maxN=2e5+5;
int N, M;
ll sum, a[maxN];
bool cmp(ll e1, ll e2) { return e1<e2; }
int main()
{
while(scanf("%d%d", &N, &M)!=EOF)
{
sum=0;
for(int i=1; i<=N; i++) scanf("%lld", &a[i]);
if(N==1)
{
printf("%lld\n", abs(a[1]-M));
continue;
}
sort(a+1, a+1+N, cmp);
int k=(int)( lower_bound(a+1, a+1+N, M) - a ), mid=((int)N/2)+1;
if(k>N) k=N;
if(k>mid)
{
for(int i=k; i>=mid; i--)
{
if(a[i]<M) sum+=( M-a[i] );
}
}
else
{
for(int i=k; i<=mid; i++)
{
sum+=( a[i]-M );
}
}
printf("%lld\n", sum);
}
return 0;
}