列表

详情


MMT5. 中位数

描述

M给你一个长度为n的数组,我们定义median数为该数组从小到大排序后,下标为(n-1)/2的数字。下标从0开始,(n-1)/2表示整数除法,即向下取整。现在我们已经得到了一个初始的数组,我们希望这个数组的median数是一个给定数字x。所以我们需要加入一些数到数组中从而完成我们的目标。数组中的元素可以重复,请问,最少需要加入多少个数字才能达成这个目标。

输入描述

第一行输入两个整数n x (1 <= n <= 500, 1 <= x <= 10^5)。

接下来一行有n个正整数表示初始的数组,用空格分开,范围是[1, 10^5]。

输出描述

输出需要加入最少的元素个数才能够使得新数组的median数成为x。

示例1

输入:

3 2
2 3 4

输出:

1

说明:

样例一中,加入1,得到1 2 3 4,那么median数的下标为(4 - 1)/2 = 1, median数为2。加一个数字就可以了。

示例2

输入:

3 4
1 2 3

输出:

4

说明:

样例二中,加入4 5 6 7,得到1 2 3 4 5 6 7,median数为4。最少加4个数字。

原站题解

C++14 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-05-18

#include <stdio.h>
     
int main()
{
    int n, x, smaller = 0, equal = 0, bigger = 0, i, m;
    scanf("%d%d", &n, &x);
    m = (n - 1) >> 1;
    for (i = 0; i < n; ++i)
    {
        int cur;
        scanf("%d", &cur);
        if (cur == x)
        {
            equal++;
        }
        else if (cur < x)
        {
            smaller++;
        }
        else
        {
            bigger++;
        }
    }
    if (smaller <= m)
    {
        if (bigger < n - m)
        {
            puts("0");
        }
        else
        {
            printf("%d\n", bigger - smaller - equal);
        }
    }
    else
    {
        printf("%d\n", smaller + 1 - equal - bigger);
    }
    return 0;
}

C++14 解法, 执行用时: 2ms, 内存消耗: 392KB, 提交时间: 2020-07-16

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,lcount=0,scount=0,ecount=0,max=0,num;
    long long int x;
    cin>>n>>x;
    long long int a[1000];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        if(a[i]>x)
            lcount++;
        else if(a[i]<x)
            scount++;
        else
        {
            ecount++;
            if(i>max)
            max=i;
        }
    }

        if(lcount>scount)
        {
            if((num=lcount-scount-ecount)>0)
                num=lcount-scount-ecount;
            else num=0;
        }
        if(lcount==scount)
            num=1-(ecount>0);
        if(lcount<scount)
        {
            if((scount+1-lcount-ecount)>0)
            num=scount+1-lcount-ecount;
            else num=0;
        }
    cout<<num;
    return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 400KB, 提交时间: 2020-08-06

#include "bits/stdc++.h"
using namespace std;
const int maxn=1e5+100;
int n,m,a[maxn];
int main()
{
    //scanf("%d%d",&n,&m);
    cin>>n>>m;
    int small=0,big=0,equal=0;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        if(a[i]<m) small++;
        else if(a[i]>m) big++;
        else equal++;
    }
    if(small<big) printf("%d\n",max(big-small-equal,0));
    else if(small>big) printf("%d\n",max(small-big-equal+1,0));
    else{
        if(equal==0) printf("1\n");
        else printf("0\n");
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 472KB, 提交时间: 2020-05-03

#include <stdio.h>
  
int main()
{
    int n, x, smaller = 0, equal = 0, bigger = 0, i, m;
    scanf("%d%d", &n, &x);
    m = (n - 1) >> 1;
    for (i = 0; i < n; ++i)
    {
        int cur;
        scanf("%d", &cur);
        if (cur == x)
        {
            equal++;
        }
        else if (cur < x)
        {
            smaller++;
        }
        else
        {
            bigger++;
        }
    }
    if (smaller <= m)
    {
        if (bigger < n - m)
        {
            puts("0");
        }
        else
        {
            printf("%d\n", bigger - smaller - equal);
        }
    }
    else
    {
        printf("%d\n", smaller + 1 - equal - bigger);
    }
    return 0;
}

C++14 解法, 执行用时: 2ms, 内存消耗: 484KB, 提交时间: 2020-05-11

#include <stdio.h>
    
int main()
{
    int n, x, smaller = 0, equal = 0, bigger = 0, i, m;
    scanf("%d%d", &n, &x);
    m = (n - 1) >> 1;
    for (i = 0; i < n; ++i)
    {
        int cur;
        scanf("%d", &cur);
        if (cur == x)
        {
            equal++;
        }
        else if (cur < x)
        {
            smaller++;
        }
        else
        {
            bigger++;
        }
    }
    if (smaller <= m)
    {
        if (bigger < n - m)
        {
            puts("0");
        }
        else
        {
            printf("%d\n", bigger - smaller - equal);
        }
    }
    else
    {
        printf("%d\n", smaller + 1 - equal - bigger);
    }
    return 0;
}

上一题