bjfu1208 中位数

 题目是给你一个数x以及一个长度为n的数列,让你往数列里插入y个数,使数列的中位数正好是x,求y的最小值。(其实这题的中位数跟数学里的中位数有一点区别,略去不提)

那么就排完序以后分情况讨论一下就好了。

具体公式我就不推了,很简单的。这里附上几组我推公式时用到的测试数据(每组三行,前两行是题目的输入,第三行表示添加方法,x表示添加的数)

5 6

1 2 2 4 5

1 2 2 4 5 6 x x x x x



5 5

1 2 2 4 5

1 2 2 4 5 x x x x



5 5

1 2 2 5 5

1 2 2 5 5 x x



5 4

1 2 2 4 5

1 2 2 4 5 x x



5 3

1 2 2 4 5

1 2 2 3 4 5 x



5 2

1 2 2 4 5

1 2 2 4 5



9 2

1 2 2 4 5 6 7 8 9

x x x 1 2 2 4 5 6 7 8 9



5 1

1 2 2 4 5

x x x 1 2 2 4 5

 

代码如下:

/*

 * Author    : ben

 */

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <queue>

#include <set>

#include <map>

#include <stack>

#include <string>

#include <vector>

#include <deque>

#include <list>

#include <functional>

#include <numeric>

#include <cctype>

using namespace std;

#ifdef ON_LOCAL_DEBUG

#else

#endif

const int maxn = 505;

int data[maxn], n, x;

int ans;



void work() {

    int mid = (n - 1) / 2;

    if (data[mid] == x) {

        return ;

    }

    int lb = lower_bound(data, data + n, x) - data;

    int ub = upper_bound(data, data + n, x) - data - 1;

    if (ub < mid) {

        ans += n - 2 * ub - 2;

    } else {

        ans += 2 * lb - n + 1;

    }

}



int main() {

#ifdef ON_LOCAL_DEBUG

    freopen("data.in", "r", stdin);

#endif

    while (scanf("%d%d", &n, &x) == 2) {

        ans = 0;

        bool has = false;

        for (int i = 0; i < n; i++) {

            scanf("%d", &data[i]);

            has = has || (data[i] == x);

        }

        if (!has) {

            data[n++] = x;

            ans++;

        }

        sort(data, data + n);

        work();

        printf("%d\n", ans);

    }

    return 0;

}

 

你可能感兴趣的:(B)