【NOIP2016提高A组五校联考1】挖金矿
Time Limits: 1000 ms Memory Limits: 524288 KB
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
解题思路
假设f[i][j]为第i行前j个数的和,第i列选择前H[i]个数,那么,答案就是
max{∑ni=1fi,Hi∑ni=1hi}
我们可以选择二分答案,假设二分的答案为ans,要符合条件就有
∑ni=1fi,Hi∑ni=1hi<=ans
得
∑ni=1fi,Hi<=∑ni=1Hi∗ans
则
∑ni=1fi,Hi−Hi∗ans>=0
那么只要求出对于当前ans,每一列的 fi,Hi−Hi∗ans 最大值,最后判断这些最大值是否不小于零,继续二分就可以了。
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);
}