【NOIP模拟】平均数
2016-06-26 07:53
204 查看
Description
给出包含一个N个整数的数组A。找出一段长度至少为K的连续序列,最大化它的平均值。请注意:一段子序列的平均值是子序列中所有数的和除以它的长度。
Solution
一看到求什么最大最小值什么的就要想到用二分答案。然后是平均数,要求他要大于某个数,那么我们就把这些数同时减去这个平均数,最后如果满足长度大于m的子串和不小于0就成立。
那么我们怎样保证长度大于m
我们循环从m到n循环,然后用1到i的和减去最小的前缀和。然后就可以O(n)搞定这一结果。
Code
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define fo(i,a,b) for(i=a;i<=b;i++) typedef double db; using namespace std; const int maxn=300007; int i,j,k,t,n,m; db ans,l,r,mid,f[maxn],a[maxn],b[maxn]; bool pan(int x){ int i,l=0,p=-0x7fffffff; db k=0,j=0; fo(i,m,n){ if(b[i]-k>=0)return 1; if(b[i-m+1]<k)k=b[i-m+1]; } return 0; } int main(){ freopen("average.in","r",stdin); freopen("average.out","w",stdout); scanf("%d%d",&n,&m); fo(i,1,n){ scanf("%lf",&a[i]); r+=a[i]; } while(r-l>1e-5){ mid=(l+r)/2;b[0]=0; fo(i,1,n)a[i]-=mid,b[i]=b[i-1]+a[i]; if(pan(mid))l=mid;else r=mid; fo(i,1,n)a[i]+=mid; } printf("%.5lf\n",l); }
相关文章推荐
- Multithreading and memory 读书笔记---_strong修饰词
- Codeforces 14D Two Path Solution
- Best Time to Buy and Sell Stock
- caffe中的lr_policy选择
- 开源新闻速递:RaspAnd 发行版可以将树莓派 3 变成一台完备的 Android 计算机
- linux环境配置tomcat开机自启动
- struts2(四)
- Real-Time 3D Rendering with DirectX and HLSL
- [leetcode] 363. Max Sum of Rectangle No Larger Than K 解题报告
- c/c++常见面试题
- 查数据库中的表,了解大体结构
- QT 信号处理
- 加一条内存条组成双通道(实战)
- C++ MFC 简单读写XML
- Android自定义控件绘制流程与Paint, Canvas相关API
- 一篇70后写下的文章:80后为什么比我们那时还艰难
- C语言学习(一)
- Socket编程(udp协议)
- Eclipse快捷键大全
- 开发经验(漫谈)