感觉好奇怪,思路就是枚举中位数后二分
而且双倍经验过了:https://www.luogu.com.cn/problem/P2797
(虽然输出的东西有差异,可是感觉没问题啊
#include<bits/stdc++.h>
#define int long long
#define db double
using namespace std;
const int N=3e5+10;
int n,a[N],s[N];
db res;
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
int p=-1,p1=-1;
for(int i=1;i<=n;i++){
int L=1,R=min(i-1,n-i),ans=-1;
while(L<=R){
int mid=L+R>>1;
db s=(db)(a[n-mid+1]+a[i-mid])/2.0;
if(s>(db)a[i]) L=mid+1,ans=mid;
else R=mid-1;
}
if(~ans){
db t=(db)(s[n]-s[n-ans]+s[i]-s[i-ans-1])/(db)(2*ans+1)-(db)a[i];
if(t>res){
res=t;
p=ans;
p1=i;
}
}
}
if(!(~p)){
printf("1\n1");
return 0;
}
printf("%lld\n",2*p+1);
for(int i=p1-p;i<=p1;i++) printf("%lld ",a[i]);
for(int i=n-p+1;i<=n;i++) printf("%lld ",a[i]);
return 0;
}