[洛谷P1404] 平均数
洛谷题目链接:平均数
题目描述
给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m。
输入输出格式
输入格式:
N+1行,
第一行两个整数n和m
接下来n行,每行一个整数a[i],表示序列第i个数字
输出格式:
一个整数,他是最大平均数的1000倍,如果末尾有小数,直接舍去,不要用四舍五入求整。
输入输出样例
输入样例#1:
10 6
6
4
2
10
3
8
5
9
4
1
输出样例#1:
6500
说明
【数据范围】
60% M<=N<=10000
100% M<=N<=100000 0<=a[i]<=2000
一句话题意: 给出一个长度为\(n\)的序列,要求出其中一个长度大于等于\(m\)的子段使得这个子段的平均值最大.
题解: 首先这个平均数是具有单调性的,如果某一个值可以作为最大平均值,那么比它大的值也有可能是平均值,如果某个值经过验证无法成为平均值,那么比这个大的就肯定无法成为平均值.所以可以想到二分.
但是如果要二分的话要怎么验证呢?
我们可以在每次\(check\)中,先将序列中的值都减去二分出来的\(mid\),然后对序列中的值求一个前缀和,再对这个前缀和统计一个最小值.我们用\(S_i\)表示1~ i的前缀和,\(Mn_i\)表示1~i中前缀和的最小值.
这样的话,我们在枚举一个长度大于等于\(m\)的区间\([i,j](j∈[i+m-1,n])\)的时候,这个区间内的和就是\(S_j-S_{i-1}\),但是因为我们已经将这个序列的每个元素都减去了\(mid\),也就相当于这个区间这个区间的平均值减去了\(mid\).这时如果区间和是大于等于0的,也就是说这个区间在没有减去\(mid\)之前它的平均值是大于等于\(mid\)的.
然后通过我们记录的\(Mn\),可以得到1~ i的前缀和的最小值,这样就可以通过固定一个右端点的方法,记录下向左扩展得到最大区间和.如果区间和是正数,那么除以它的个数后还是正数,则存在一个子段使得这个区间的平均值大于等于\(mid\).
然后最后算出来的结果最好是加一个较小的数,因为转int向下取整,有可能会使答案变小,加一个较小的数会被向下取整忽略掉.
#include<bits/stdc++.h>
using namespace std;
const int N=100000+5;
const double eps=1e-5;
const int inf=2147483647;
int n, m, ans = 0;
double a[N], b[N], s[N], mn[N];
int gi(){
int ans = 0, f = 1; char i = getchar();
while(i<'0' || i>'9'){ if(i == '-') f = -1; i = getchar(); }
while(i>='0' && i<='9') ans = ans*10+i-'0', i = getchar();
return ans * f;
}
bool check1(double mid){
memcpy(b, a, sizeof(b));
for(int i=1;i<=n;i++) b[i] -= mid, s[i] = s[i-1]+b[i], mn[i] = min(mn[i-1], s[i]);
for(int i=m;i<=n;i++)
if(s[i]-mn[i-m] > 0) return true;
return false;
}
int main(){
//freopen("cowfnc.in", "r", stdin);
//freopen("cowfnc.out", "w", stdout);
n = gi(), m = gi(); mn[0] = 0;
for(int i=1;i<=n;i++) a[i] = gi();
double l = 0, r = inf, res;
while(r-l > eps){
double mid = (l+r)/2;
if(check1(mid)) res = mid, l = mid;
else r = mid;
}
ans = (res+2e-4)*1000;
cout << ans << endl;
return 0;
}
ps:鸡哥巨佬要我把讲解都删掉,然后膜他
Brave_Cattle sto yyj orz Brave_Cattle
[洛谷P1404] 平均数的更多相关文章
- 洛谷 P1404 平均数
P1404 平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来n ...
- 洛谷——P1404 平均数
P1404 平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 前缀和+二分答案 #include<iostream> ...
- 洛谷P1404 平均数 [01分数规划,二分答案]
题目传送门 平均数 题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来n ...
- 洛谷P1471 方差
蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. ——by 洛谷; http://www.luogu.org/problem/show?pid=1 ...
- 洛谷 P1471 方差
洛谷 P1471 方差 题目背景 滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的 ...
- 【洛谷5月月赛】玩游戏(NTT,生成函数)
[洛谷5月月赛]玩游戏(NTT,生成函数) 题面 Luogu 题解 看一下要求的是什么东西 \((a_x+b_y)^i\)的期望.期望显然是所有答案和的平均数. 所以求出所有的答案就在乘一个逆元就好了 ...
- 【洛谷p1031】均分纸牌
[博客园的第一条随笔,值得纪念一下] 均分纸牌[传送门] 洛谷上的算法标签是 这道题是一道贪心题,过了四遍才过(蒟蒻有点废) 第一遍的时候考虑的非常少,只想到了求出平均数→求差值→从左往右加差值: 这 ...
- 【BZOJ2830/洛谷3830】随机树(动态规划)
[BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...
- 洛谷 P3307: bzoj 3202: [SDOI2013] 项链
题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...
随机推荐
- Thunder团队第一次Scrum会议
Scrum会议1 小组名称:Thunder 项目名称:待定 参会成员: 王航(Master):http://www.cnblogs.com/wangh013/ 李传康:http://www.cnblo ...
- TCP系列31—窗口管理&流控—5、TCP流控与滑窗
一.TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个R ...
- 【Spring.Net】- 环境搭建
参考文章:http://www.cnblogs.com/GoodHelper/archive/2009/10/25/SpringNET_Config.html 一.环境下载及安装 到Spring的官方 ...
- c++ new 堆 栈
根据32位的Windows系统默认有2GB的用户空间,则不能new超过2GB的,执行下列代码: ***]; 会出现下面的错误 error C2148: 数组的总大小不得超过 0x7fffffff 字节 ...
- 在select中,载入时默认select为空白,选项内不显示空白项
有两种办法,一种纯css实现,一种借助js实现. html: <body onload="load()"> <select id="abc" ...
- 在Ubuntu系统下编译arcsim仿真器
首先,用tar zxvf arcsim-0.2.1.tar.gz 将软件包解压 然后,打开里面的INSTALL文件,按照里面的步骤一步一步安装库.Ubuntu13.04下 1.BLAS sudo ap ...
- 【bzoj1593】[Usaco2008 Feb]Hotel 旅馆 线段树区间合并
题目描述 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大的旅馆一共有N (1 <= N & ...
- P4035 [JSOI2008]球形空间产生器
题目描述 有一个球形空间产生器能够在 nn 维空间中产生一个坚硬的球体.现在,你被困在了这个 nn 维球体中,你只知道球面上 n+1n+1 个点的坐标,你需要以最快的速度确定这个 nn 维球体的球心坐 ...
- CentOS 文件搜索find
1.文件搜索,内置的的命令是find 用法: find [查找路径] 寻找条件 操作 默认路径为当前目录:默认表达式为 -print 2.主要参数: -name 匹配名称 -perm 匹配权限(mod ...
- BZOJ1257:[CQOI2007]余数之和——题解+证明
http://www.lydsy.com/JudgeOnline/problem.php?id=1257 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod ...