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

来源:互联网 发布:怪物猎人ol美男子数据 编辑:程序博客网 时间:2024/05/23 12:37

Description

这里写图片描述

Input

这里写图片描述

Output

答案,保留4位小数

Sample Input

4 3
4 3 3
5 1 6
2 6 1
3 2 9

Sample Output

4.4286

Data Constraint

n*m<=100000

Solution

很简单的一道题
设sum[i][j]表示第i列向下挖j行的前缀和
假设第i列挖h[i]行
设二分的答案是m,答案如果合法,那么

ni=1sum[i][h[i]]ni=1h[i]>=m

移项
i=1nsum[i][h[i]]h[i]x>=0

那么二分后枚举得到ni=1sum[i][h[i]]h[i]x,判断是否大于0即可

Code

#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define N 100100#define db doubleusing namespace std;int n,m,q,tot=0;db f[2][N],a[N];int main(){    scanf("%d%d",&n,&m);    fo(i,1,n*m) scanf("%lf",&a[i]);    db l=0.0,r=1000000000.0;    for(;r-l>0.00001;)    {        db x=(l+r)/2.0,jy=0;        fo(i,1,n)        {            db mx=-21474836477777,s=a[(i-1)*m+1];            fo(j,1,m) mx=max(mx,s-j*x),s+=a[(i-1)*m+j+1];            jy+=mx;        }        if(jy<0) r=x;else l=x;    }    printf("%.4lf",l);}
1 0
原创粉丝点击