首页 > 其他 > 详细

BZOJ 4757 Building a Tall Barn

时间:2017-02-16 14:39:29      阅读:303      评论:0      收藏:0      [点我收藏+]

。。。。。。。。

。。。。。。。。

深感佩服。

对每个位置,每加一头奶牛的偏移量是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\n",ans);
    return 0;
}

 

BZOJ 4757 Building a Tall Barn

原文:http://www.cnblogs.com/ziliuziliu/p/6404761.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!