POJ2018 Best Cow Fences-程序员宅基地

我对二分的理解:https://www.cnblogs.com/AKMer/p/9737477.html

题目传送门:http://poj.org/problem?id=2018

我们二分一个平均数,设\(a\)数组每个数减去平均数为\(b\)数组,若\(b\)数组当中存在某一段长度大于\(k\)并且这一段权值和大于\(0\),那么说明最终平均值肯定大于我们当前二分的平均值。

那么怎么求\(b\)数组当中权值和大于\(0\)且长度大于\(k\)的一段呢?显然这样的段我们可以这样枚举:

for(int i=1;i<=n;i++)
    for(int j=0;j<=i-k;j++)
        if(sum[i]-sum[j]>0)return 1;

但是这个\(n^2\)做法显然不行。我们可以发现,以\(i\)结尾的段落,设\(mn\)\(sum[0]~sum[i-k]\)当中的最小值,只要\(sum[i]-mn>0\)就行了。所以我们只需要在\(i+1\)的时候,把\(mn\)\(sum[i-k+1]\)\(min\)就行了。

时间复杂度:\(O(nloga)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;

const double eps=1e-6;
const int maxn=1e5+5;

int n,k;
int a[maxn];
double sum[maxn];

int read() {
    int x=0,f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    return x*f;
}

bool check(double ave) {
    for(int i=1;i<=n;i++)
        sum[i]=sum[i-1]+(double)a[i]-ave;
    double mn=0;
    for(int i=k;i<=n;i++) {
        if(sum[i]-mn>0)return 1;
        mn=min(mn,sum[i-k+1]);
    }
    return 0;
}

int main() {
    double l=1e9,r=-1e9;
    n=read(),k=read();
    for(int i=1;i<=n;i++) {
        a[i]=read();
        l=min(l,(double)a[i]);
        r=max(r,(double)a[i]);
    }
    while(l+eps<r) {
        double mid=(l+r)/2;
        if(check(mid))l=mid;
        else r=mid;
    }
    printf("%d\n",(int)(r*1000));//因为平均值肯定比l大,所以输出r*1000
    return 0;
}

转载于:https://www.cnblogs.com/AKMer/p/9744367.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aga28832/article/details/102271719

智能推荐

hsqldb的使用方法-程序员宅基地

文章浏览阅读595次。现在很多开源项目使用hsqldb作为数据库。了解hsqldb的基本使用方法还是很必要的。这篇不是全面介绍hsqldb的文字,但我认为用这个笔记的内容调试程序够用了。 一、下载数据库,地址在http://sourceforge.net/projects/hsqldb/files/hsqldb/ 我使用的是1.8.0版本。假定下载解压后的目录是D:/hsqldb/, 那么hsqldb.jar在D:/hsqldb/lib目录下。这个jar文件是hsqldb的核心包 二、启动数据库,比如数据库名称为tes_hsqldb的使用

ubuntu查看 固态硬盘位置_ubuntu新增加固态硬盘,格式化并挂载到根目录下-程序员宅基地

文章浏览阅读1.2k次。前言:将固态硬盘装到电脑,ubuntu系统需要格式化并挂载才能正式使用将固态装在电脑上后,打开后端1:查看现有硬盘分区及挂载状态命令 :df -h没有新增的SSD固态硬盘2:查看服务器所有安装的硬盘状态(包括已安装和未安装的)命令: fdisk -l此时已经安装的磁盘,但是没有分区,先分区3, 将磁盘分区,分一个区挂载到根目录下命令:fdisk /dev/sdb (该目录是上面未安装的磁盘目录)..._怎么看固态硬盘在服务器上的挂载路径

TortoiseSVN使用简介_tortoisesvn 文件哪个版本好用-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏16次。TortoiseSVN使用简介_tortoisesvn 文件哪个版本好用

iOS 屏幕适配浅谈-程序员宅基地

文章浏览阅读379次。作者 | 钱凯杏仁移动开发工程师,前嵌入式工程师,关注大前端技术新潮流。前端开发的屏幕适配其实算是基本功,每个码农在长期实践中都有自己的总结。在 iOS 平台上,苹果爸爸对适配的支持个人感觉很不人性化,提供了 AutoLayout、sizeClass 等技术,感觉没有前端类似 flexBox 这样的技术来得灵活。像是点歪了技能树,过于重视使用 xib 配置_cgfloat left 适配

MATLAB中eval函数和cell型数组的组合使用_matlab eval cell-程序员宅基地

文章浏览阅读674次。MATLAB中eval函数和cell型数组的组合使用一、evaleval的功能简单来说就是可以把字符串当做命令来执行。经常用于循环当中,特别是有些变量的名字中含有有规律的数字。二、{ }大括号,用于cell型的数组(就是前面讲的单元数组)的分配或引用。比如 a{3,3}=‘china’就是建立了一个3*3的单元数组,a(3,3)就是‘china’三、应用我们在matlab中有事可能会遇到a1、a2、a3…这样的组合,想利用for语句使用里面的数据却无法成功。(例如ai未定义等原因)此时我们使_matlab eval cell

tomcat启动占了12g_tomcat服务为何报内存相关错误??-程序员宅基地

文章浏览阅读86次。本帖最后由 linux_love 于 2014-9-19 11:46 编辑多谢各位英雄支持,这个问题困扰我N久了,昨天终于让我给拿下了,在Linux下有个CommitLimit 用于限制系统应用使用的内存资源,#grep -i commit /proc/meminfoCommitLimit: 20389524 kBCommitted_AS: 18541832 kB其中:CommitLim..._commited_as 被谁占了

随便推点

python 特征选择卡方_4. 机器学习之特征选择-Python代码-程序员宅基地

文章浏览阅读719次。1. 特征选择------sklearn代码1.1 特征选择------方差法忽略warning错误import warningswarnings.filterwarnings("ignore")# 方差法from sklearn.feature_selection import VarianceThresholdX = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1..._python 方差法选择特征

WebGL快速入门_webgl入门-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏11次。WebGL是一种用于在Web浏览器中实现高性能3D图形的技术。本文将帮助读者快速入门WebGL,了解其基本概念和使用方法。我们将介绍WebGL的基本架构和API,包括如何创建WebGL上下文、渲染对象和着色器编程等。此外,我们还会深入探讨WebGL的基本原理和渲染管线,以及如何通过优化渲染流程来提升性能。通过学习本文,读者将能够理解WebGL的核心概念和使用方法,并能够开始开发高性能的3D应用程序。_webgl入门

C++中的String的常用函数用法总结_string函数-程序员宅基地

文章浏览阅读10w+次,点赞1.3k次,收藏6.1k次。一. string的构造函数的形式: string str:生成空字符串string s(str):生成字符串为str的复制品string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值string s(cstr, char_len):以C_string类型cstr的前char_len个字..._string函数

金融风控训练营金融风控基础知识学习笔记_风控师学习笔记-程序员宅基地

文章浏览阅读162次。一、赛题理解和学习目标:本次挑战赛以个人信贷为背景,要求选手对金融风控之贷款是否违约进行预测,以此判断是否通过此项贷款的一项问题型比赛。通过学习Task1了解第一个学习内容,要求对金融风控的问题建立数学模型最后给定金融风险程度。在此过程中要了解混淆矩阵、AUC评价指标,KS统计量等二、学习内容:混淆矩阵就是一个2×2的矩阵分为真正类TP、真分类TN、假正类FT、假反类FNFP FN TP TN AUC被定义在ROC曲线下与坐标轴围成的面积(ROC曲线:以真阳性率._风控师学习笔记

哈希表 添加 增添 删除 获取方法 Js封装_js hash追加-程序员宅基地

文章浏览阅读237次。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>D._js hash追加

JS数据结构-Set集合,创建Set,常用Set方法_js set-程序员宅基地

文章浏览阅读7.6k次,点赞7次,收藏12次。Set  ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。  很多时候我们把Set叫做 集合,但是,Set可以是集合,集合不一定是Set。  特性:唯一性=>不重复=>能够对数据进行去重操作。  注:集合去重,是全等匹配,===。创建Set  Set 本身是一个构造函数,调用构造函数用来生成 Set 数据结构。  关键词 标识符 = new Set();  例 let i = new Set();    Set 函数可以接受一个数组_js set

推荐文章

热门文章

相关标签