Description
Input
Output
Sample Input
4 3
4 3 3
5 1 6
2 6 1
3 2 9
Sample Output
4.4286
Data Constraint
Hint
分析
对于每一列,我们设挖了hi 层
那么,平均值就是∑ni=1sumi,hi∑ni=1hi
如果我们二分了一个平均值mid
则就有
∑ni=1sumi,hi∑ni=1hi>mid
移项后可以不用除法
得:
∑ni=1sumi,hi−hi∗mid
对于每一列都枚举一个hi 就可以了。
注意精度问题。
code(c++)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
using namespace std;
int main()
{
int h,n;
scanf("%d%d",&n,&h);
int a[100003];
double l,r,mid,s,mx;
long long sum[100003];
for(int i=1;i<=n;i++)
for(int j=1;j<=h;j++)
{
scanf("%d",&a[(i-1)*h+j]);
if(a[(i-1)*h+j]>r)r=a[(i-1)*h+j];
if(j!=1)sum[(i-1)*h+j]=sum[(i-1)*h+j-1]+a[(i-1)*h+j];
else sum[(i-1)*h+j]=a[(i-1)*h+j];
}
l=0;
while(l+0.000001<r)
{
mid=(l+r)/2;
s=0;
for(int i=1;i<=n;i++)
{
mx=-2147483647;
for(int j=1;j<=h;j++)
mx=max(mx,sum[(i-1)*h+j]-j*mid);
s+=mx;
}
if(s>=0)l=mid;else r=mid;
}
printf("%.4lf",mid);
}