【题解 && 蓝书刷题 && 二分答案】 Best Cow Fenes

发布时间:2024-12-10 10:08

二手图书交易中的常见问题解答 #生活技巧# #节俭生活# #二手图书买卖#

【题解 && 蓝书刷题 && 二分答案】 Best Cow Fenes

最新推荐文章于 2020-12-10 12:57:28 发布

鹭天 于 2019-07-06 21:24:39 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

题目描述:

农场主 John (简称 FJ) 的农场有一长排的 N (1 <= N <= 100,000)块地组成. 每块地有一定数量 (ncows) 的牛, 1 <= ncows <=2000.
FJ 想修建环绕邻接的一组地块的栅栏, 以最大化这组地块中平均每块地中牛的个数.
这组地块必须包含至少 F (1 <= F <= N) 块地, F 作为输入给出.
给定约束, 计算出栅栏的布置情况以最大化平均数.

分析:

暴力分很好拿,只需要搞一个前缀和便可以

想正解

首先我们仍可以处理出前缀和 s u m [ i ] sum[i] sum[i]表示前i个数的和
求一个字段和,可以转化为前缀和相减的形式:
m a x i − j ≥ L { A j + 1 + A j + 2 + … … + A i } = m a x { s u m i − m i n 0 ≤ j ≤ n { s u m j } } max_{i-j\geq L}\{A_{j+1}+A_{j+2}+……+A_i\}=max\{sum_i-min_{0\leq j \leq n}\{sum_j\}\} maxi−j≥L​{Aj+1​+Aj+2​+……+Ai​}=max{sumi​−min0≤j≤n​{sumj​}}

这时我们发现每当i增加1,j的相应值也只会增加1.
根据这个性质,我们便可以舍去一层循环,直接用一个变量记录当前的最小值即可,只要与新进来的数进行比较

这样便可以 O ( n ) O(n) O(n)求出最大子段和。

由于问题具有单调性(自己思考),我们便可以用二分答案来二分平均数,将数列中每个数都减去平均数求一边最大子段和看是否>0即可

Code

#include<bits/stdc++.h> using namespace std; int n,m; double a[1011000],b[101010],summ[101010]; int main(){freopen("cowfnc.in","r",stdin);freopen("cowfnc.out","w",stdout); scanf("%d %d",&n,&m); for (int i=1;i<=n;i++) scanf("%lf",&a[i]); double k=0.00000001,l=-1000000.000,r=1000000.000; while (r-l>k){ double mid=(l+r)/double(2); for (int i=1;i<=n;i++) b[i]=a[i]-mid; for (int i=1;i<=n;i++) summ[i]=summ[i-1]+b[i]; double minn=1000000.000,ans=-10000000; for (int i=m;i<=n;i++) minn=min(minn,summ[i-m]),ans=max(ans,summ[i]-minn); if (ans>=0) l=mid; else r=mid;}printf("%d",int(r*1000));return 0; }

12345678910111213141516171819202122232425

网址:【题解 && 蓝书刷题 && 二分答案】 Best Cow Fenes https://www.yuejiaxmz.com/news/view/433276

相关内容

《旧书》阅读题及答案
【刷刷题APP】刷刷题APP下载
高校真题及答案详解教育真题高校各专业教师招聘试卷和面试题及答案
锅碗瓢盆题目答案解析,锅碗瓢盆题目答案解析
高考化学大题:命题特点+答题策略=满分解题技巧!
小学一、二年级数学下册考试经典型题+易错题(附答案)!
电热水器题目答案解析,电热水器题目答案解析
2021网络安全知识竞赛题库及答案(选择题+判断题)
职场压力解决方案试题答案
解决实际生活问题的答题集

随便看看