7-4 中位数
admin
2024-01-29 01:12:50

一个有 n 个整数的数组 a,n是一个奇数。

每次可以选择数组里的一个元素 ai​ 并把这个元素加上 1。

在至多 k 次操作之后,数组的中位数最大能变成多少。

输入格式:

多组输入

第一行两个整数 n,k(1≤n≤2×105,1≤k≤109)。

第二行 n 和整数 a1​,a2​,......,an​。

输出格式:

k 次操作后数组的中位数。


输入样例:

3 2
1 3 5

输出样例:

5

简单讲解

首先将数据读入nums[],排序后求得当前中位数的下标mid

因为一共可以加K,要求让nums[mid]最大

所有答案就是 "nums[mid]+k"   ??? 显然是不对的!

因为当nums[mid] == nums[mid+1] 时候, 前者再加1,中位数就变了...

而我们要做的,就是一直填中位数的位置,只看位置不看数

所以我们要用一个数(文中为num),动态的记录:

nums[mid] == nums[mid+1] == .... ==  nums[mid+num] 的位置

核心思想

只要让判断

nums[mid]+z == nums[mid+1]+z==...==nums[mid+num]+z == nums[mid+num+1]

且 k >= z*num ,我们就可把mid位置的高度同步到nums[mid+num+1]的高度

即此时 k-=z*num,num++;

当 k < z*num时,那么nums[mid]最终的值就是 当前nums[mid]+=k/num


C/C++ 

#include
long long nums[100001];
int n,k;
void OP();
int main()
{while (scanf("%d %d",&n,&k)!=EOF) OP();return 0;
}
void OP()
{for(int z=0;z1){flag /= 2;for(int z=0;z=0){if(key=(nums[mid+num]-nums[mid])*num){k -= (nums[mid+num]-nums[mid])*num;nums[mid] = nums[mid+num];num++;}printf("%lld\n",nums[mid]+k/num);
}


相关内容

热门资讯

山水皆有情!丽江两山一江的千年... 去过丽江、走过虎跳峡的人,大概率都听过哈巴雪山和金沙江的传说。很多人站在峡谷之下,望着奔腾不息的金沙...
活力中国调研行丨“殷”你而来 ... 9月12日,游客在殷墟博物馆“甲骨文展厅”内参观。位于河南省安阳市的殷墟博物馆新馆是首个全景式展现商...
浦江之夜赴美好相逢,第37届上... 9月12日晚,黄浦江畔灯火璀璨,第37届上海旅游节大巡游在外滩中山东一路上演。不少观众早早便来到外滩...
美丽中国丨秋韵紫鹊界 梯田入画... 这是9月11日拍摄的紫鹊界梯田(无人机照片)。 金秋九月,湖南省娄底市新化县紫鹊界梯田稻谷渐次成熟。...
中国之巅奏响《共同的节日》,千... 千吨阻尼器,“迎世赛、游上海旅游节”。9月13日,由上海市文化和旅游局指导推出上海旅游·会客│巅峰之...