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