[贪心][前缀和] Jzoj P4256 平均数

Description

给出包含一个N个整数的数组A。找出一段长度至少为K的连续序列,最大化它的平均值。
请注意:一段子序列的平均值是子序列中所有数的和除以它的长度。

Input

第一行包含两个整数N(1<=N<=300000),K(1<=K<=N)。
 第二行包含N个整数,代表数组A,1<=ai<=10^6。

Output

一行一个实数,代表最大的平均值。允许在0.001以内的绝对误差。

Sample Input

输入1:4 11 2 3 4输入2:4 22 4 3 4输入3:6 37 1 2 1 3 6

Sample Output

输出1:4.000000输出2:3.666666输出3:3.333333

Data Constraint

对于30%的数据,N<=5000。
对于100%的数据,1<=N<=300000, 1<=K<=N, 1<=Ai<=1000000。

题解

  • 先二分出来一个平均值,然后将序列里的所有数减去二分出来的数
  • 然后求一遍前缀和直接判断就好了

代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #define N 300010
 4 using namespace std;
 5 int n,k;
 6 double l,r,mid,a[N],b[N],eps=1e-5;
 7 bool check(int x)
 8 {
 9     double p=0;
10     for (int i=k;i<=n;i++)
11     {
12         if (b[i]-p>=0) return 1;
13         if (b[i-k+1]<p) p=b[i-k+1];
14     }
15     return 0;
16 }
17 int main()
18 {
19     freopen("average.in","r",stdin),freopen("average.out","w",stdout),scanf("%d%d",&n,&k);
20     for (int i=1;i<=n;i++) scanf("%lf",&a[i]),r+=a[i];
21     while (r-l>eps)
22     {
23         double mid=(l+r)/2.0; b[0]=0;
24         for (int i=1;i<=n;i++) a[i]-=mid,b[i]=b[i-1]+a[i];
25         if (check(mid)) l=mid; else r=mid;
26         for (int i=1;i<=n;i++) a[i]+=mid;
27     }
28     printf("%.5lf",l);
29 }

原文地址:https://www.cnblogs.com/Comfortable/p/10358964.html

时间: 2024-10-08 15:57:46

[贪心][前缀和] Jzoj P4256 平均数的相关文章

[贪心][前缀和] JZOJ P1795 教主的别墅

Description [题目背景] LHX教主身为宇宙第一富翁,拥有一栋富丽堂皇的别墅,由于别墅实在太大了,于是教主雇佣了许许多多的人来负责别墅的卫生工作,我们不妨称这些人为LHXee. [题目描述] 教主一共雇佣了N个LHXee,这些LHXee有男有女. 教主的大别墅一共有M个房间,现在所有的LHXee在教主面前排成了一排.教主要把N个LHXee分成恰好M个部分,每个部分在队列中都是连续的一段,然后分别去打扫M个房间. 教主身为全世界知识最渊博的人,他当然知道男女搭配干活不累的道理,以及狼多

均分纸牌(贪心求区间和为平均数的最多个数)

Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上:在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上:其他堆上取的纸牌,可以移到相邻左边或右边的堆上. 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多. 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动3次可达到目的: 从 ③

[平衡规划][模拟][前缀和] Jzoj P4724 斐波那契

Description DJL为了避免成为一只咸鱼,来找czgj学习Fibonacci数列.通过czgj的谆谆教导,DJL明白了Fibonacci数列是这样定义的:F(1)=1;F(2)=1;F(n)=F(n-1)+F(n-2)(n>2)Czgj深谙熟能生巧的道理,于是他给了DJL一个数列,并安排了如下的训练计划:1.“1 L r”,表示给ai 加上F(i-L+1) ,其中L<=i<=r :2.“2 L r”,表示询问 的值.DJL经过长时间的学习,感觉身体被掏空,他希望你能帮他解决这个

Codeforces 578B Or Game (前缀和 + 贪心)

Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] 题目链接:B. "Or" Game You are given \(n\) numbers \(a_1,?a_2,?...,?a_n\). You can perform at most \(k\) operations. For each operation you can multiply one of the numbers by \(x\). We want to make

numpy 与 pandas

numpy: import numpy as np np.array([1,2,3]) 创建数组 np.arange(10).reshape(2,5) 类似于range(起始,终止,步长),可以加reshape(2,5)定义形状.必须是相乘等于前面的size np.linsapace(1,10,10) 参数为:起始,终止,平分多少个 zeros((2,4)) 根据指定形状和dtype创建全0数组 ones((2,4)) 根据指定形状和dtype创建全1数组 empty((2,4)) 根据指定形状

利用Python进行数据分析:【NumPy】

一.NumPy:数组计算1.NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础.2.NumPy的主要功能: # ndarray,一个多维数组结构,高效且节省空间 # 无需循环对整组数据进行快速运算的数学函数 # *读写磁盘数据的工具以及用于操作内存映射文件的工具 # *线性代数.随机数生成和傅里叶变换功能 # *用于集成C.C++等代码的工具 3.安装方法:pip install numpy 二.NumPy:ndarray-多维数组对象1.创建ndarray:np

Numpy库使用

一.NumPy:数组计算 1.NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. 2.NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进行快速运算的数学函数 *读写磁盘数据的工具以及用于操作内存映射文件的工具 *线性代数.随机数生成和傅里叶变换功能 *用于集成C.C++等代码的工具 3.安装方法:pip install numpy4.引用方式:import numpy as np 二.NumPy:ndarray-多维数

numpy模块的基本使用

目录 基础相关 narray数组创建 常用的属性 数据类型(dtype) 进阶知识 range与arange 共同点 不同点 向量化数学运算 数组与标量运算 数组运算(shape必须相同) 索引与切片 索引 数组重塑(reshape) 切片 数组转置以及轴对换 通用函数 一元函数 二元函数 数学统计方法 随机数 基础相关 narray数组创建 方法 描述 array() 将列表转换为数组,可选择显式指定dtype arange() range的numpy版,支持浮点数 linspace() 类似

数据分析-Numpy

什么是Numpy NumPy这个词来源于两个单词-- Numerical和Python. NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组,很多的数据科学的包都是依赖于Numpy的.它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体验在原生Python中永远无法体验到的速度. 安装 pip install numpy ndarray numpy所有的操作都是围绕着数组展开的,这个数组的名字就叫做 ndarray ,在学习nd