【POJ2018】【实数域上的二分】【dp】
2024-08-30 05:21:55
传送门:http://poj.org/problem?id=2018;
大概题意是求一个正整数数列 A 的平均数最大 长度不小于 L 的子段
我们可以二分答案 判定是否有一个长度不小于L的子段 平均数不小于二分值
我们把数列数减去二分的答案 则判断是否一个长度不小于L的子段 和大于0
众所周知我们可以用两个前缀和的值相减来表示
我们只用对于每个i记录在i-L前最小的sum就可以了
贴代码(同时注意一些实数域二分的技巧就好)
#include<iostream>
#include<cstdio>
using namespace std;
long long n,L;
double a[1000001],b[1000001],sum[1000001];
int main()
{
scanf("%lld%lld",&n,&L);
for(long long i = 1;i <= n;i++)
scanf("%lf",&a[i]);
double eps = 1e-5;
double l = -1e6,r = 1e6;
while (r - l > eps)
{
double mid = (l + r) / 2;
for(long long i = 1; i <= n; i++) b[i] = a[i] - mid;
for(long long i = 1; i <= n; i++) sum[i] = sum[i - 1] + b[i];
double ans = -1e10;
double min_val = 1e10;
for(long long i = L; i <= n ; i++)
{
min_val = min(min_val, sum[i - L]);
ans = max(ans, sum[i] - min_val);
}
if(ans >= 0) l = mid;
else
r = mid;
}
cout << int (r * 1000) << endl;
}
最新文章
- AngularJS +HTML Demo
- dedecms 图片集上传时提示错误信息“(FILEID:1|2|3..)“的解决
- Ruby on Rails框架开发学习
- Oracle 11g EM安全证书问题无法访问的解决办法
- Java 编程要点之并发(Concurrency)详解
- Android 添加子视图(addView和setView)
- Hadoop--Hadoop的机架感知
- eclipes快捷键
- Node js redis
- 社团的CTF逆向题WriteUp
- 【题解】 bzoj3693: 圆桌会议 (线段树+霍尔定理)
- [leetcode]94. Binary Tree Inorder Traversal二叉树中序遍历
- mac OS X下Java项目环境搭建+IntelliJ IDEA Jrebel插件安装与破解+Office 2016破解版安装
- Springframework和Hibernate版本对应关系
- Debug和汇编编译器masm对指令的不同处理
- java Exception 出错的栈信息打印到日志中 打印堆栈信息
- Java中float和double转换的问题
- Python 文件IO
- ubuntu 12.04 LTS server 中文乱码【转】
- Kali-linux使用假冒令牌