[Avanzado de alta eficiencia de Ybtoj 1.3] [dos puntos] media máxima

[Avanzado de alta eficiencia de Ybtoj 1.3] [dos puntos] media máxima

tema

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


Ideas para resolver problemas

Promedio de enumeración bipartita
calculado después de restar el número promedio de todos los prefijos y
si el período del segmento no negativo y la
descripción de este valor de evaluación de intervalo es mayor que el
intervalo de rango de enumeración directa de mitad de ciclo dividido doble actual
concebible no largo El intervalo
es menor que L, por lo que si se resta un valor menor, la suma de los intervalos será mejor.
Solo necesita conocer el valor más pequeño de 1 a iL.
Solo necesita el final del período de enumeración.


Código

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-5;
int n,c,da;
double l,r,a[100010],sum[100010];
bool pd(double x)
{
    
    
	 double mi=1e10,ans=-1e10;
	 memset(sum,0,sizeof(sum));
	 for (int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]-x;  //求前缀和
	 for (int i=c;i<=n;i++)
	 {
    
    
	 	 mi=min(mi,sum[i-c]);  //找最小的值
	 	 ans=max(ans,sum[i]-mi);  //更新答案
	 } 
	 return ans>=0;  
}
int main()
{
    
    
	scanf("%d%d",&n,&c);
	for (int i=1;i<=n;i++)
	    cin>>a[i];
	l=-1e6,r=1e6;
	while (l+eps<r)
    {
    
     
          double mid=(l+r)/2; 
		  if (pd(mid))
		     l=mid;
			 else r=mid;
	} 
	da=r*1000;
	printf("%d\n",da);
	return 0;
} 

Supongo que te gusta

Origin blog.csdn.net/qq_45621109/article/details/112112419
Recomendado
Clasificación