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

来源:互联网 发布:高爆地雷升级数据 编辑:程序博客网 时间:2024/05/21 19:33

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

Time Limits: 1000 ms Memory Limits: 524288 KB

Description
Description
Input
Input
Output
Output
Sample Input

4 34 3 35 1 62 6 13 2 9

Sample Output

4.4286

Data Constraint
Data
Hint
Hint


解题思路


假设f[i][j]为第i行前j个数的和,第i列选择前H[i]个数,那么,答案就是
max{ni=1fi,Hini=1hi}

我们可以选择二分答案,假设二分的答案为ans,要符合条件就有
ni=1fi,Hini=1hi<=ans


ni=1fi,Hi<=ni=1Hians


ni=1fi,HiHians>=0

那么只要求出对于当前ans,每一列的fi,HiHians 最大值,最后判断这些最大值是否不小于零,继续二分就可以了。

Codes:
#include<cstdio>#include<cstring>using namespace std;int n,m;double l[100001];int main(){    scanf("%d%d",&n,&m);    for(int i=0;i<n;i++)    {        for(int j=1;j<=m;j++)        {             scanf("%lf",&l[i*m+j]);        }    }    double h=0,t=10000000000,ans;    while(h+(0.000001)<t)    {        double sum=0,mid=(h+t)/2;        for(int i=0;i<n;i++)        {            double maxn=-21474836472,s=0;            for(int j=1;j<=m;j++)            {                s+=l[m*i+j];                if(s-j*mid>maxn)                {                    maxn=s-j*mid;                }            }            sum+=maxn;        }        if(sum<0)        {            t=mid-(0.000001);        }else        {            h=mid;        }        ans=mid;    }    printf("%.4lf",ans);}
0 0
原创粉丝点击