POJ 2018 Best Cow Fences(二分答案)
题目链接:http://poj.org/problem?id=2018
题目给了一些农场,每个农场有一定数量的奶牛,农场依次排列,问选择至少连续排列F个农场的序列,使这些农场的奶牛平均数量最大,求最大数量*1000/农场的个数。
思路:题目是求是否存在一个长度不小于F的子段,使得平均数最大。
1.用二分法从给定数据的最小平均数到最大平均数进行二分枚举,每次枚举的平均值为mid,那么子段的每一个元素减去mid值再求和应当大于0,否则不满足题意,这样可以不断地二分,最终找到最大的mid值
2.判断子段和可以利用前缀和,每次二分的时候,先行让每个元素减去mid值,再求一个前缀和sum[i],前缀和大于0则说明平均数大于mid
3.从 i = F开始枚举到i = N,每次都要记录当前0到(i - N)的最小前缀和minval,因为当sum[ i ] - minval时,才可能存在长度不小于F且子段和最大的序列。
4.因为是在实数域上的二分,所以要注意精度问题,精度eps一般取1e-(k+2),此题k为3(1000是10的3次方)
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
double a[100002],b[100002],sum[100002];
int main(){
int N,F;
scanf("%d%d",&N,&F);
for(int i = 1;i<=N;i++){
scanf("%lf",&a[i]);
}
double l = -1e6, r = 1e6;
while(l+1e-5 < r){//注意精度问题
double mid = (l + r)/2;
for(int i = 1;i<=N;i++){
b[i] = a[i] - mid;//依次减去枚举的平均值mid
}
for(int i = 1;i<=N;i++){
sum[i] = (b[i] + sum[i-1]);//求前缀和
}
double ans = -1e10,minVal = 1e10;
for(int i = F;i<=N;i++){
minVal = min(minVal,sum[i-F]);//记录当前最小前缀和
//且保证子段大于等于F
ans = max(ans,sum[i] - minVal); //求子段最大和
}
if(ans >= 0){
l = mid ;
}
else{
r = mid ;
}
}
cout<<int(r*1000);
return 0;
}
POJ 2018 Best Cow Fences(二分答案)的更多相关文章
- POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)
$ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 ...
- POJ 2018 Best Cow Fences(二分+最大连续子段和)
Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14601 Accepted: 4720 Desc ...
- Poj 2018 Best Cow Fences(分数规划+DP&&斜率优化)
Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Description Farmer John's farm consists of a ...
- poj2018 Best Cow Fences[二分答案or凸包优化]
题目. 首先暴力很好搞,但是优化的话就不会了.放弃QWQ. 做法1:二分答案 然后发现平均值是$ave=\frac{sum}{len}$,这种形式似乎可以二分答案?把$len$移到左边. 于是二分$a ...
- POJ 2018 Best Cow Fences(二分最大区间平均数)题解
题意:给出长度>=f的最大连续区间平均数 思路:二分这个平均数,然后O(n)判断是否可行,再调整l,r.判断方法是,先求出每个数对这个平均数的贡献,再求出长度>=f的最大贡献的区间,如果这 ...
- POJ 2018 Best Cow Fences
斜率优化. 设$s[i]$表示前缀和,$avg(i,j)=(s[j]-s[i-1])/(j-(i-1))$.就是$(j,s[j])$与$(i-1,s[i-1])$两点之间的斜率. 如果,我们目前在计算 ...
- POJ-2018 Best Cow Fences(二分加DP)
Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10174 Accepted: 3294 Desc ...
- POJ 3662 Telephone Lines(二分答案+SPFA)
[题目链接] http://poj.org/problem?id=3662 [题目大意] 给出点,给出两点之间连线的长度,有k次免费连线, 要求从起点连到终点,所用的费用为免费连线外的最长的长度. 求 ...
- loj#10012\poj2018 Best Cow Fences(二分)
题目 #10012 「一本通 1.2 例 2」Best Cow Fences 解析 有序列\(\{a_i\}\),设\([l,r]\)上的平均值为\(\bar{x}\),有\(\sum_{i=l}^r ...
随机推荐
- CSS隐藏元素的五种方法
1.opacity:0 2.visibility:hidden 3.diaplay:none 4.position:absolute display display属性依照词义真正隐藏元素.将disp ...
- scala-匹配序列和元组
scala的模式匹配极其强大,其中有一种用法是用case语句匹配序列和元组. 放码过来: def parse(x: Any): String = x match { case List(0, _, _ ...
- 假期学习【五】RDD编程实验四
今天完成了实验四的第二问和第三问 第二题 对于两个输入文件 A 和 B,编写 Spark 独立应用程序,对两个文件进行合并,并剔除其 中重复的内容,得到一个新文件 C.下面是输入文件和输出文件的一个样 ...
- Microsoft Visual Studio 显示行号
工具下面有一个选项
- docker 的基本命令
查看命令 docker images 查看镜像 docker ps 查看正在运行的容器 docker ps -a 查看所有的容器 docker inspect container-name 记录着 D ...
- AntDesign(React)学习-4 登录页面提交数据简单实现
github代码:https://github.com/zhaogaojian/jgdemo 全国肺炎,过节期间没地方去在家学习antd. 一.感觉antd pro项目太庞大了,可以学习下结构和代码风 ...
- vs2017+resharper之常用快捷键备忘
1.安装resharper后以vs2017的快捷键为主,让resharper作为一些方便的快捷键的补充. 2.vs2017的c++6的键盘布局模式快捷键 IntelliSence: 列表成员: Ctr ...
- 理解 nodeJS 中的 buffer,stream
在Node.js开发中,当遇到 buffer,stream,和二进制数据处理时,你是否像我一样,总是感到困惑?这种感觉是否会让你认为不了解它们,以为它们不适合你,认为而这些是Node.js作者们的事情 ...
- Windows恢复环境启动失败,重新配置WinRE
前言 现在很多朋友追求系统镜像体积缩小,往往删除了系统镜像中C:\Windows\System32\Recovery\winre.wim这个文件,大小将近500MB,删除这个文件不会给系统造成其他影响 ...
- IDEA更换背景颜色与字体
打开IDEA 选择左上角的File -> Setting -> Editor -> Color Scheme 就可以设置 黑白背景 默认为白色 可以选择 Darcul ...