题目描述

原题来自:USACO 2003 Mar. Green

给定一个长度为 N 的非负整数序列 A ,求一个平均数最大的,长度不小于 L 的子段。

输入格式

第一行用空格分隔的两个整数 N 和 L;

第二行为 N 个用空格隔开的非负整数,表示A_i 。

输出格式

输出一个整数,表示这个平均数的 1000 倍。不用四舍五入,直接输出。

样例

样例输入

10 6
6 4 2 10 3 8 5 9 4 1

样例输出

6500

数据范围与提示

n<=1e5,A_i<=2000。

______________________________________________

USACO的题目,很经典!

求的是长度不小于L,平均值最大的子序列。输出平均值。

二分平均值,然后让序列中的后有的数都减去二分的平均值,这样如果某个子序列的所有数的和大于0,则这个子序列的平均值大于二分的平均值!

题目不算难做,但是最后结果的处理比较麻烦,保留三位小数但不四舍五入!!

处理了好几次 !

______________________________________________ 
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,l;
double sz[maxn],f[maxn];
bool pd(double x)
{
for(int i=1;i<=n;++i)f[i]=sz[i]-x;
double mn=0;
for(int i=1;i<l;++i)f[i]=f[i-1]+f[i];
for(int i=l;i<=n;++i)
{
f[i]=f[i]+f[i-1];
mn=min(mn,f[i-l]);
if(f[i]>=mn)return 1;
}
return 0;
} int main()
{
scanf("%d%d",&n,&l);
for(int i=1;i<=n;++i)scanf("%lf",sz+i);
double l=0,r=2000;
while(l+1e-8<r)
{
double mid=(l+r)/2;
if(pd(mid))l=mid;
else r=mid;
}
cout<<int(r*1000);
return 0;
}

最新文章

  1. Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录
  2. TCP/IP四层模型
  3. UWP中的Direct2D
  4. Quartz集群配置
  5. HV和VM 内存性能测试对比结果
  6. centos7安装openvswitch虚拟交换机
  7. win2008 r2 远程桌面问题
  8. 如何使用 Cloud Insight SDK 实现 Druid 监控?
  9. background:url 的使用方法
  10. Viewpager实现图片轮播
  11. jpg图片在开发板上显示
  12. Linux安装MariaDB(Mysql)和简单配置
  13. v7000数据恢复_MDisk重建数据恢复方法(北亚数据恢复)
  14. linux下postgres的安装
  15. [转帖]一键获取 所有连接过的wifi 密码
  16. Centos7初始化脚本
  17. FastReport快速入门
  18. 【ASP.NET】System.Web.Routing - StopRoutingHandler Class
  19. ubuntu下pycharm调用Hanlp实践分享
  20. wpf 导出Excel

热门文章

  1. sql中模糊查询和在开始和结束时间之间
  2. [leetcode350]Intersection of Two Arrays II求数组交集
  3. RTC_Configuration
  4. TurtleBot3 Waffle (tx2版华夫)(2)系统安装
  5. FFT原理及C++与MATLAB混合编程详细介绍
  6. 分享一个的c++写的,模仿awk的框架类CAwkDoc
  7. Itranswarp 搭建个人 Wiki
  8. centos 安装 部署 gitlab github
  9. 【剑指 Offer】12.矩阵中的路径
  10. 修改hosts文件后不生效,该怎么办