JZOJ4809. 【NOIP2016提高A组五校联考1】挖金矿

来源:互联网 发布:手机淘宝买彩票在哪里 编辑:程序博客网 时间:2024/06/10 06:52

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,hini=1hi
如果我们二分了一个平均值mid
则就有
ni=1sumi,hini=1himid
移项后可以不用除法
得:
ni=1sumi,hihimid

对于每一列都枚举一个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);} 
2 0