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月9日,星期三(农历七月廿八),23‑37°C。 当太阳缓缓沉...
带爸妈去了趟江西,三天走了两万... 带爸妈去了趟江西,三天走了两万多步 我爸无意中说了句“想去江西看看”,我就订了票。去之前我妈嘴上抱怨...
曲江暮色游线|芙蓉园、曲江池、... 十三朝古都长安的暮色从来不是城市退去喧嚣的转场,而是整座城最浪漫的序幕。西边的终南山收尽最后一缕橘色...
“语言在这一刻是多余的” (来源:中国旅游报) 转自:中国旅游报 外国游客体验芙蓉镇莓茶炒制过程  受访者 供图 □ 本报记...