[USACO17JAN]Building a Tall Barn建谷仓

本文介绍了一个USACO竞赛题目“Building a Tall Barn”的解决方案,采用二分查找法来确定最优的牛群分布,以最小化谷仓的高度。通过计算每层牛增加一头所需的额外高度,实现资源的有效分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[USACO17JAN]Building a Tall Barn建谷仓

神奇的二分

题解:

Luogu题解。

令 ti 表示 第i层多一头牛的改变量

ti=a[i]/ci(ci+1)

最终状态中 ti 一定是很接近的,否则可以从j拿一头牛到i去,使得结果更优

所以我们就二分 ti

ti=a[i]/ci(ci+1) —> ci2+ciai/ti=0

反解出ci,然后对ci求和,如果不到k-n则可以缩小上界,否则提高下界。

Code:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const double eps = 1e-9;
const int N = 100005;

int n; double a[N];
long long m;

bool check(double t){
    long long sum=0; double c;
    for(int i=1;i<=n;i++){
        c=(sqrt(1+4*a[i]/t)-1)/2;
        sum+=ceil(c);
        if(sum>m) return false;
    }
    return true;
}

int main(){
    freopen("a.in","r",stdin);
    scanf("%d%lld",&n,&m);
    for(int i=1;i<=n;i++) scanf("%lf",a+i);
    double l=eps,r=12,mid;
    for(int i=1;i<=50;i++){
        mid=(l+r)/2;
        if(check(mid)) r=mid;
        else l=mid;
    }
    double t=mid,c,ans=0.0; long long sum=0;
    for(int i=1;i<=n;i++){
        c=(sqrt(1+4*a[i]/t)-1)/2;
        sum+=ceil(c);
        ans+=a[i]/ceil(c);
    }
//  printf("%.5f\n",t);
//  printf("%.5f\n",ans);
    printf("%.0f\n",ans-(m-sum)*t);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值