题意
给定一个 V 图 𝑎 ,找到一个 𝑏 具有最大可能平均值的 V 图,该 𝑏 图 是 的 𝑎 连续子序列。
输出一个实数,表示最大可能的平均值。
如果答案的绝对误差或相对误差不超过 1e-9,则认为您的答案是正确的。
分析
所给数据大小先减后增,我们可以先标记最小值,要确保答案也存在V图时,所以最后的平均值一定含有最小值相邻的两个数,在找平均值时,我们可以直接分为三个板块,全部数的最大值,最小数左边的平均值,以及最小数右边的平均值,(因为如果有一边的数足够大,另一边的数足够小,那么使得平均值最大的为数足够大的一边,但当两边数都相当大,数越多平均数就越大)将三者比较得出结论。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+10;
int a[n];
void sovle()
{
int n;
cin>>n;
double sum=0,sum1=0,sum2=0;
int mi=INT_MAX,b;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
if(a[i]<mi)
{
mi=a[i];
b=i;
}
}
for(int i=1;i<=b+1;i++)
{
sum1+=a[i];
}
for(int i=b-1;i<=n;i++)
{
sum2=+a[i];
}
double x=sum/n;
double y=sum1/(b+1);
double z=sum2/(n-(b-1)+1);
double ans=max(x,max(y,z));
printf("%.20lf\n",ans);
}
signe main()
{
int n;
cin>>n;
while(n--)
{
solve();
}
return 0;
}