题目

[USACO14MAR]Sabotage G

题解

本蒟蒻又来了,这道题可以用二分答案来解决。我们可以设答案最小平均产奶量为 \(x \ (x \in[1,10000])\) 。然后二分搜索 \(x\) 的最小值。

\[\frac{sum-sum[l,r]}{n-(r-l+1)}\leq x
\]
\[nx-(r-l+1)x\geq sum-sum[l,r]
\]
\[sum-nx \leq \sum\limits_{i=l}^r{(a[i]-x)}
\]

对于如何求 \(\sum\limits_{i=l}^r{(a[i]-x)}\) 的最大值,这个很简单,套用最大子段和的解法即可。

最后根据 \(sum-nx \leq \sum\limits_{i=l}^r{(a[i]-x)}\) 的判断结果来调整二分搜索的区间即可,直至区间长度 \(< 10^{-5}\) 。

贴一下代码

#include<iostream>
using namespace std;
const double e = 1e-5;
int n, a[100001];
double sum = 0; bool check(double x)
{
double snx = sum - n * x;
double s = 0;
for (int i = 2; i < n; i++)
{
s += a[i] - x;
if (s >= snx)
return 1;
if (s < 0)
s = 0;
}
return 0;
} int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
sum += a[i];
}
double l = 1, r = 10000;
while (r-l>=e)
{
double mid = (l + r) / 2;
if (check(mid))
r = mid;
else
l = mid+e;
}
printf("%.3lf",l);
return 0;
}

最新文章

  1. Java 多线程 自定义线程辅助
  2. NSString,NSArray,NSNumber等类的继承问题
  3. javascript获取asp.net服务器端控件的值
  4. win 7~~~win 10 debug的使用方法
  5. Theano2.1.8-基础知识之装载和保存
  6. android firmware 利用UDP socket发送Magic Packet--python版本
  7. 阿里云中Centos下配置防火墙
  8. js事件执行顺序
  9. hiho_1061_beautiful_string
  10. linux 下安装JDK1.7
  11. c-指针的指针
  12. Android Studio怎样安装插件
  13. USACO Section 1.2 Transformations 解题报告
  14. js禁止滚动条移动
  15. djang-tastypie学习整理
  16. JavaScript之事件及动画
  17. 【BootStrap】 布局组件 I
  18. SpringBoot2.X + SpringCache + redis解决乱码问题
  19. php guzzle post async
  20. Redis(五):几个常用概念

热门文章

  1. mysql 版本在springboot 中定义位置
  2. decimal和float的区别
  3. spring框架的学习-&gt;从零开始学JAVA系列
  4. pytest框架fixture的使用
  5. C++ //运算符重载 +号
  6. Echarts 展示两条动态数据曲线
  7. Ubuntu 查询用户账号
  8. Linux系统启动初始化
  9. 深度学习框架如何自动选择最快的算法?Fast Run 让你收获最好的性能!
  10. SQL 练习34