loj10012 Best Cow Fences
2024-09-07 01:19:48
题目描述
原题来自: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;
}
最新文章
- Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录
- TCP/IP四层模型
- UWP中的Direct2D
- Quartz集群配置
- HV和VM 内存性能测试对比结果
- centos7安装openvswitch虚拟交换机
- win2008 r2 远程桌面问题
- 如何使用 Cloud Insight SDK 实现 Druid 监控?
- background:url 的使用方法
- Viewpager实现图片轮播
- jpg图片在开发板上显示
- Linux安装MariaDB(Mysql)和简单配置
- v7000数据恢复_MDisk重建数据恢复方法(北亚数据恢复)
- linux下postgres的安装
- [转帖]一键获取 所有连接过的wifi 密码
- Centos7初始化脚本
- FastReport快速入门
- 【ASP.NET】System.Web.Routing - StopRoutingHandler Class
- ubuntu下pycharm调用Hanlp实践分享
- wpf 导出Excel
热门文章
- sql中模糊查询和在开始和结束时间之间
- [leetcode350]Intersection of Two Arrays II求数组交集
- RTC_Configuration
- TurtleBot3 Waffle (tx2版华夫)(2)系统安装
- FFT原理及C++与MATLAB混合编程详细介绍
- 分享一个的c++写的,模仿awk的框架类CAwkDoc
- Itranswarp 搭建个人 Wiki
- centos 安装 部署 gitlab github
- 【剑指 Offer】12.矩阵中的路径
- 修改hosts文件后不生效,该怎么办