建议加强数据
查看原帖
建议加强数据
376997
Harry27182SDream楼主2022/7/14 11:01

蒟蒻太菜了考场上没想出二分,然后发现暴力跑的很快,于是加了一下玄学的不保证正确性的剪枝,然后就过了,建议加强数据

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int n,a[100005],sum[100005],Sum[100005];
double ans=1e9;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
	for(int i=n;i>=1;i--)Sum[i]=Sum[i+1]+a[i];
	if(n<=10000)
	{
		for(int i=2;i<n;i++)
		{
			for(int j=i;j<n;j++)
			{
				double now=(double)(sum[n]-sum[j]+sum[i-1])/(double)(n-j+i-1);
				ans=min(ans,now);
			}
		}
		printf("%.3lf",ans);
		return 0;
	}
	for(int i=2;i<n;i+=4)
	{
		int num=i;
		if(a[i]==max(max(a[i],a[i+1]),max(a[i+2],a[i+3])))i=i;
		else if(a[i+1]==max(max(a[i],a[i+1]),max(a[i+2],a[i+3])))i=i+1;
		else if(a[i+2]==max(max(a[i],a[i+1]),max(a[i+2],a[i+3])))i=i+2;
		else if(a[i+3]==max(max(a[i],a[i+1]),max(a[i+2],a[i+3])))i=i+3;
		for(int j=i;j<n;j++)
		{
			double now=(double)(sum[n]-sum[j]+sum[i-1])/(double)(n-j+i-1);
			if(n>10000&&(double)Sum[j+1]/(double)(n-j)<now)break;
			ans=min(ans,now);
		}
		i=num;
		if(clock()>990000)break;
	}
	printf("%.3lf",ans);
	return 0;
}
2022/7/14 11:01
加载中...