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);
}


相关内容

热门资讯

西纳台子:德令哈,灵魂与自然同... 刊头题字: 谈生忠 一个有温度的公众号 每天发布·或诗或文 用作者的诗意·填补生活的空白 德令哈,蒙...
美丽吉安:初冬的井冈山挹翠湖公... 美丽吉安:初冬的井冈山挹翠湖公园风光迷人(摄/王伟) 美丽吉安:初冬的井冈山挹翠湖公园风光迷人(摄...
下一站,土耳其!广东文旅借全球... 深圳商报·读创客户端首席记者 袁静娴 近日,携程集团第八届全球合作伙伴峰会在土耳其伊斯坦布尔举行。广...
世界旅游联盟发布旅游促进乡村发... 潮新闻客户端 记者 周丰 11月18日至21日,“2025世界旅游联盟·湘湖对话”在杭州举办。本届“...
海报|江苏“破纪录”名场面:原... 2025年的吉尼斯世界纪录日定于11月20日。在“吉尼斯世界纪录日(GWR Day)”这一天,全世界...