BZOJ 4757 Building a Tall Barn

。。。。。。。。

。。。。。。。。

深感佩服。

对每个位置,每加一头奶牛的偏移量是a[i]/(c*(c+1))。

然后二分所有位置的最小值,对每个位置解出c,如果所有c的和<=k那么允许更新答案。

你说不对?

出题人告诉你答案四舍五入。。本来一个不是很对的算法就这么过掉了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100050
#define eps 1e-13
using namespace std;
long long n,k,a[maxn],mx=0;
double l,r,mid,ans=0;
bool check(double x)
{
    long long ret=0;
    for (long long i=1;i<=n;i++)
    {
        double c=(sqrt(1+(double)4*a[i]/x)-1)/2+1;
        ret+=(long long)c;
    }
    return ret<=k;
}
int main()
{
    scanf("%lld%lld",&n,&k);
    for (long long i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        mx=max(mx,a[i]);
    }
    l=0;r=mx;
    while (r-l>eps)
    {
        mid=(l+r)/2;
        if (check(mid)) r=mid;
        else l=mid;
    }
    if (check(l))
    {
        for (long long i=1;i<=n;i++) 
        {
            long long c=(long long)(sqrt(1+(double)4*a[i]/l)-1)/2;
            ans+=(double)a[i]/c;
        }
    }
    else
    {
        for (long long i=1;i<=n;i++) 
        {
            long long c=(long long)(sqrt(1+(double)4*a[i]/r)-1)/2+1;
            ans+=(double)a[i]/c;
        }
    }
    printf("%.0lf
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/ziliuziliu/p/6404761.html