博客
关于我
《算法竞赛进阶指南》 最佳牛围栏 · 二分
阅读量:241 次
发布时间:2019-03-01

本文共 1017 字,大约阅读时间需要 3 分钟。

题解

关于求平均值的最大值

实数二分答案模板: r - l > 1e-5

判断答案的合法性

等同于判断是否存在一个长度大于F的区间,其平均值大于等于给定值

而关于平均值有一个常用操作:让区间内的数都减去这个平均值

现在问题转换一下变成,判断是否存在一个长度大于F的区间,使得区间和大于0

判断这个区间是否存在,也就是说对于区间右端点j,要看是否存在一个区间左端点i,其之间的长度大于F,且满足 sum[j]-sum[i-1]>=0

而询问左端点i是否存在,只要在距离j大于等于F的范围内,找到一个最小值,使其满足 sum[j]-sum[i-1]>=0

几个注意点

因为是浮点数,所以求mid时,不可以采用 l+r>>1,应该使用 (l+r)/2


在这里插入图片描述


#include 
using namespace std;const int N = 1e5 + 10;const double eps = 1e-5;int n, f, a[N];double sum[N];bool check(double avg) { for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i] - avg; double minv = 0x3f; for (int i = 0, j = f; j <= n; i++, j++) { // sum[i,j] = sum[j]-sum[i-1] minv = min(minv, sum[i]); if (sum[j] - minv >= 0) return true; } return false;}int main() { cin >> n >> f; for (int i = 1; i <= n; i++) { cin >> a[i]; } double l = 1, r = 2000; while (r - l > eps) { double mid = (l + r) / 2; if (check(mid)) l = mid; else r = mid; } cout << (int) (r * 1000);}

转载地址:http://bjet.baihongyu.com/

你可能感兴趣的文章
Mysql学习总结(12)——21分钟Mysql入门教程
查看>>
Mysql学习总结(13)——使用JDBC处理MySQL大数据
查看>>
Mysql学习总结(14)——Mysql主从复制配置
查看>>
Mysql学习总结(15)——Mysql错误码大全
查看>>
Mysql学习总结(16)——Mysql之数据库设计规范
查看>>
Mysql学习总结(17)——MySQL数据库表设计优化
查看>>
Mysql学习总结(18)——Mysql主从架构的复制原理及配置详解
查看>>
Mysql学习总结(19)——Mysql无法创建外键的原因
查看>>
Mysql学习总结(19)——Mysql无法创建外键的原因
查看>>
Mysql学习总结(1)——常用sql语句汇总
查看>>
Mysql学习总结(20)——MySQL数据库优化的最佳实践
查看>>
Mysql学习总结(21)——MySQL数据库常见面试题
查看>>
Mysql学习总结(22)——Mysql数据库中制作千万级测试表
查看>>
Mysql学习总结(23)——MySQL统计函数和分组查询
查看>>
Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
查看>>
Mysql学习总结(25)——MySQL外连接查询
查看>>
Mysql学习总结(26)——MySQL子查询
查看>>
Mysql学习总结(27)——Mysql数据库字符串函数
查看>>
Mysql学习总结(28)——MySQL建表规范与常见问题
查看>>
Mysql学习总结(29)——MySQL中CHAR和VARCHAR
查看>>