求助,不知道是做法假了还是其他问题
查看原帖
求助,不知道是做法假了还是其他问题
323130
YEMIYZ楼主2021/11/5 08:35

用类似于求最大子段和的贪心思想

从1往后枚举,如果加上当前点不如从k个点前开始,那么就换成从前k个点开始,否则就往下加

WA了11点

expected 492.8991597

found 492.8850000

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
inline void read(int &x)
{
	x=0;bool t=false;char c=getchar();
	while(c<'0'||c>'9')c=='-'?t=1:0,c=getchar();
	while(c>='0'&&c<='9')x=x*10+(c&15),c=getchar();
	t?x=-x:x;
}
int n,k;
int a[N];
ll sum[N];
int main()
{
//	freopen("average.in","r",stdin);
//	freopen("average.out","w",stdout);
	read(n);read(k);
	for(int i=1;i<=n;i++)
		read(a[i]),sum[i]=sum[i-1]+a[i];//前缀和求平均值
	long double ans=0;
	int ave=1;//ave表示区间起点
	for(int i=k;i<=n;++i)
	{
		long double now=1.0000000000000000*(sum[i]-sum[ave-1])/(i-ave+1);
		long double change=1.00000000000000000*(sum[i]-sum[i-k])/k;
		if(now<change)
		{
			ave=i-k+1;
			now=change;
		}
		ans=max(ans,now);
	}
	cout<<fixed<<setprecision(15)<<ans<<endl;
	return 0;
}//从1往后枚举,如果加上当前点不如从k个点前开始,那么就换成从前k个点开始,否则就往下加
 

2021/11/5 08:35
加载中...