伪中位数问题

n个数的伪中位数定义为从小到大排序后第[(n + 1)/2]个数。其中,[x]的意思是x向下取整。
现在,给你n个数,你需要向其中增加最少的数,使得k成为最后这一组数的伪中位数。
请问你需要加入数的最少数

/*  输入第一行包含两个数n,k,意为原来数的个数和最后的伪中位数。
    接下来一行输入n个数,空格隔开,代表原来的数

    思路:将输入的数先进行排序,找到k这个数在原来的数中的位置begin,end(因为k在原来的数中可能会重复,所以找到起始位置和终止位置)
         分三种情况讨论:
            1.伪中位数在begin和end区间内
            2.伪中位数在begin和end区间左边
            3.伪中位数在begin和end区间右边
*/

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int getIncreasedQuantity(vector<int>& datas, int n, int k) {
    
    
	int mid = ((n + 1) / 2) + ((n + 1) % 2);
	int begin = -1;
	int end = 0;
	for (int i = 0; i < n; i++) {
    
    
		if (datas.at(i) == k) {
    
    
			begin = (begin == -1) ? i : begin;
			end = i;
		}
	}
	begin++;
	end++;
	return (mid - begin) >= 0 && (mid - end) <= 0 ? 0 :
		(mid - end) > 0 ? (mid - end) : (begin - mid);
}

int main() {
    
    
	int n = 0;
	int k = 0;
	cin >> n >> k;
	vector<int> datas;
	for (int i = 0; i < n; i++) {
    
    
		int data;
		cin >> data;
		datas.push_back(data);
	}
	sort(datas.begin(), datas.end());
	cout << getIncreasedQuantity(datas, n, k) << endl;

	system("pause");
	return 0;
}

如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢

猜你喜欢

转载自blog.csdn.net/xiao_ma_nong_last/article/details/105602786