题目描述

Farmer John is building a brand new, NNN -story barn, with the help of his KKK cows ( 1≤N≤K≤10121 \leq N \leq K \leq 10^{12}1≤N≤K≤1012 and N≤105N \leq 10^5N≤105 ). To build it as quickly as possible, he needs your help to figure out how to allocate work among the cows.

Each cow must be assigned to work on exactly one specific floor out of the NNN total floors in the barn, and each floor must have at least one cow assigned to it. The iii th floor requires aia_iai​ units of total work, and each cow completes one unit of work per hour, so if ccc cows work on floor iii , it will be completed in ai/ca_i / cai​/c units of time. For safety reasons, floor iii must be completed before construction can begin on floor i+1i+1i+1 .

Please compute the minimum total time in which the barn can be completed, if the cows are allocated to work on floors in an optimal fashion. Output this number rounded to the nearest integer; it is guaranteed that the solution will be more than 0.1 from the boundary between two integers.

FJ正在他的K头奶牛的帮助下建造一个全新的N层谷仓(1<=N<=K<=10^12,N<=10^5)。为了能够尽快的建造它,他需要你帮助他来找出如何在奶牛间分配工作。

每一头牛必须分配到N层中的某一个特定楼层中,并且每一层楼必须至少有一头牛在其中工作。第i层楼需要a[i]个单位的工作,并且每一头牛完成每一单位的工作需要一个单位时间。所以如果有C头牛在第i层工作,那么第i层需要a[i]/c个单位时间。为了安全起见,在施工开始于在第i+1层楼上前,必须先完成第i层。

如果奶牛被分配以最佳方式在楼层上工作,请计算完成谷仓的最小总时间。输出这个时间四舍五入到整数的结果;题目保证解答离两个整数之间的边界大于0.1。

输入输出格式

输入格式:

The first line of input contains NNN and KKK .

The next NNN lines contain a1…aNa_1 \ldots a_Na1​…aN​ , each a positive integer of size at most 101210^{12}1012 .

第一行包括两个数N和K。

接下来N行包括了a[1]...a[n],每行一个不大于10^12的正整数。

输出格式:

Please output the minimum time required to build the barn, rounded to the

nearest integer.

请输出完成谷仓的最小总时间(四舍五入至最接近的整数)。

输入输出样例

输入样例#1:

2 5
10
4
输出样例#1:

5

提交地址: Luogu3606

答案抄的真爽, 就是抄了一晚上,WA了n次,才找出来错误, 崩溃ing...

这道题其实一眼就知道二分答案, 想都没想直接敲,16分,what...f?

回过头再仔细读题解, 发现这题并不简单;

我们知道a[1],a[2]...a[n],也知道k,我们要求a[1]/b[1]+a[2]/b[2]+...+a[n]/b[n]的最小值,其中Σbi=k;

这仿佛不是一个寻常的二分可以搞定的;

仔细琢磨题解你会发现,我们要让其中每一层楼,不加入一个牛,比加入一个牛更优,什么意思?
就是我们考虑, 如果这个楼层加一个牛比不加一个牛优,那我们肯定会把别的楼层的牛拿过来给他;
那我们该怎么表示这个抽象的东西呢? 我们设:ti = ai / (ci + 1) - ai / ci , ci是第i层楼的牛数量;
这样我们设出来的ti,就表示这个楼层多一只牛的改变量,我们要求的最终答案,肯定是每层楼的ti最接近,否则我们肯定可以找一只牛放里面; 化简一下得到 ti = ai / (ci * (ci + 1)) ,移项得 ci^2 - ci - ai/ti = 0; 发现我们只要枚举ti, 就可以通过简单的小学数学,把ci算出来; 然后开开心心的二分; 最后如果有空闲的牛就直接乘以r,然后减掉就行了,为什么要乘r?
因为我们二分出来了一个ti,这个ti保证是所有楼层的ti(因为他们最接近的时候才是答案),所以直接乘ti,当成他们的贡献! 有几个坑点,首先记得开long long,还得记得二分一个小数一定要设eps... Code:
 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define int long long
#define ll long long
double eps = 1e-;
ll n, k;
double a[]; double l = 1e-, r = , mid;
double ans;
ll now; inline bool check(double x)
{
now = ;
double res = ;
for (register ll i = ; i <= n ; i ++)
{
double h = (sqrt( + * a[i] / x) - ) / ;
ll f = ceil(h);
now += f;
if (now > k) return ;
}
return ;
} signed main()
{
scanf("%lld%lld", &n, &k);
for (register ll i = ; i <= n ; i ++) cin >> a[i]; while (r - l > eps)
{
mid = (l + r) / ;
bool fl = check(mid);
if (fl) r = mid;
else l = mid;
} ans = 0.0, now = ;
for (register ll i = ; i <= n ; i ++)
{
double h = (sqrt( + * (a[i] / r)) - ) / ;
ll f = ceil(h);
ans += a[i]/f;
now += f;
} printf("%.0lf", ans - (k - now) * r);
return ;
}

[USACO17JAN]Building a Tall Barn建谷仓的更多相关文章

  1. [luoguP3606] [USACO17JAN]Building a Tall Barn建谷仓(贪心 + 线段树)

    传送门 把线段都读进来然后排序,先按右端点为第一关键字从小到大排序,后按左端点为第二关键字从小到大排序. 注意不能先按左端点后按右端点排序,否则会出现大包小的情况,如下: —————— ———  — ...

  2. [USACO07FEB]新牛棚Building A New Barn

    洛谷题目链接:[USACO07FEB]新牛棚Building A New Barn 题目描述 After scrimping and saving for years, Farmer John has ...

  3. Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学

    1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 394  Solve ...

  4. 洛谷 2957 [USACO09OCT]谷仓里的回声Barn Echoes

    题目描述 The cows enjoy mooing at the barn because their moos echo back, although sometimes not complete ...

  5. 洛谷P2874 [USACO07FEB]新牛棚Building A New Barn [贪心]

    题目传送门 题目描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wan ...

  6. 洛谷——P2957 [USACO09OCT]谷仓里的回声Barn Echoes

    https://www.luogu.org/problem/show?pid=2957 题目描述 The cows enjoy mooing at the barn because their moo ...

  7. [USACO09OCT]谷仓里的回声Barn Echoes(hush、STL)

    https://www.luogu.org/problem/P2957 题目描述 The cows enjoy mooing at the barn because their moos echo b ...

  8. [luoguP2957] [USACO09OCT]谷仓里的回声Barn Echoes(Hash)

    传送门 团队里的hash水题,数据小的不用hash都能过.. 也就是前缀hash,后缀hash,再比较一下就行. ——代码 #include <cstdio> #include <c ...

  9. TZOJ 1689 Building A New Barn(求平面上有几个其它点求到n个点的曼哈顿距离最小)

    描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wants the b ...

随机推荐

  1. mysql数据库事务隔离原理

    今天在学习JDBC的时候看到了关于MySQL的事务的隔离级别的问题,感觉内容挺高级的,所以记录一篇文章,以备后面使用. 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说 ...

  2. python自增自减?赋值语句返回值?逗号表达式?

    咳咳,直接进入正题吧. 自增自减(++/--),以及赋值语句,还有逗号表达式都是在C/C++中常见的运算符或表达式. 熟悉C/C++的小伙伴们都知道,在C/C++中: 自增自减(前缀/后缀)运算符将实 ...

  3. Cookie的获取

    1.先创建Cookie对象,设置Cookie的键和值: Cookie cookie1="); Cookie cookie2="); Cookie cookie3="); ...

  4. C++基础之关联容器

    关联容器 关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素.顺序容器通过元素在容器中的位置顺序存储和访问元素.因此,关联容器不提供front.push_front.pop_front.ba ...

  5. Redis会遇到的问题以及解决方案

    1.缓存雪崩 发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机 解决办法: 1)随机均匀设置失效时间 2)设置过期标 ...

  6. electron教程(二): http服务器, ws服务器, 进程管理

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(二): http服务器, ws服务器, 进程管理 electron教程(三): 使 ...

  7. JavaScipt第四天笔记

    JS笔记 1.以后遇到用构造函数创建对象就用NEW 2.用构造函数创建对象语法: var obj1 = new Object();//创建一个空对象 var obj2 = new Object({ n ...

  8. Flask基础(03)-->创建第一个Flask程序

    # 导入Flask from flask import Flask # 创建Flask的应用程序 # 参数__name__指的是Flask所对应的模块,其决定静态文件从哪个地方开始寻找 app = F ...

  9. MongoDB的查询索引

    ​ 目录 为什么要建立索引? 索引的分类有哪些? _id索引 单键索引 多键索引 复合索引 过期索引 hello,今天是万圣节

  10. P5369 [PKUSC2018]最大前缀和

    状态压缩 P5369 题意:求所有排列下的最大前缀和之和 一步转化: 求最大前缀和的前缀由数集S组成的方案数, 统计答案时直接乘上sum(S)即可 考虑最大前缀和的性质: 设最大前缀和为sum[i] ...