求调
查看原帖
求调
315205
Kniqht楼主2023/11/9 16:31

感觉好奇怪,思路就是枚举中位数后二分

而且双倍经验过了: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;
}

2023/11/9 16:31
加载中...