瞎想的,做的时候就以为是道贪心,最后想出个这个玩楞,中间寻找j点也可以用二分去做。用前缀和去小小优化一下,算法的瓶颈还是在排序上。大伙看一乐呵,还是老老实实二分吧,太菜了。
时间复杂度
这道题时间复杂度主要还是在排序上 O(nlogn)
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=200010;
LL a[N],s[N];
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
int x=n,t=n/2;
for(int i=n/2+1;i<=n;i++)
{
LL sum=s[i]-s[t];
if((sum+k)/(i-t)<a[i])
{
x=i-1;
break;
}
}
cout<<(s[x]-s[t]+k)/(x-t)<<endl;
return 0;
}
唔,突然看见,我说一下菜鸡我的思路:排序找到中位数后依次和后面的数比较就好啦,只要不相等就+1,如果有相等的就继续往后面比较且这些相等的数都加1(但实际上不用模拟地这么彻底 只需要给中位数加1就好 每次拿中位数在和后面的比较)可以写成类似于双指针的样子,然后知道和最后一个数都相等且k无法再使相等的数+1即可结束。贴个本菜的代码https://www.acwing.com/activity/content/code/content/1297735/,你可以参考参考我的思路~