P1404 平均数
题目描述
给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m。
前缀和+二分答案
#include<iostream> #include<cstdio> #include<cstdlib> #define N 1000006 #define inf 0x7fffffff #define eps 1e-5 using namespace std; int n,m; double a[N],b[N],sum[N]; bool check(double X){ for(int i=1;i<=n;i++) b[i]=a[i]-X,sum[i]=sum[i-1]+b[i]; double minn=9000000000000; for(int i=m;i<=n;i++){ minn=min(minn,sum[i-m]); if(double(sum[i]-minn)+eps>0) return true; } return false; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%lf",&a[i]); double l=0,r=2000.00,mid; for(int i=1;i<=100;i++){ mid=(l+r)/2.0; if(check(mid)) l=mid; else r=mid; } printf("%d",(int)(l*1000)); return 0; }