当前位置:网站首页>102. 最佳牛围栏
102. 最佳牛围栏
2022-08-03 16:47:00 【Hunter_Kevin】
题目
农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头。
约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。
围起区域内至少需要包含 F 块地,其中 F 会在输入中给出。
在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。
输入格式
第一行输入整数 N 和 F,数据间用空格隔开。
接下来 N 行,每行输入一个整数,第 i+1 行输入的整数代表第 i 片区域内包含的牛的数目。
输出格式
输出一个整数,表示平均值的最大值乘以 1000 再 向下取整 之后得到的结果。
数据范围
1≤N≤100000
1≤F≤N
输入样例:
10 6
6
4
2
10
3
8
5
9
4
1
输出样例:
6500
代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int num[N];
double sum[N];
int n, m;
bool check(double avg){
// 计算减掉平均值的前缀和
// 针对平均值avg计算出的前缀和
for(int i = 1; i <= n; i++) sum[i] = sum[i-1] + num[i] - avg;
double mmin = 0;//记录i位置前的最小值
// sum[j]-sum[i]即i~j的总和,如果sum[j]-sum[i]>=0,则说明长度为j-i的序列的总和>=0
// 即长度至少为m的序列减去平均值avg之后的和大于0,如果有满足此条件的j和i,则说明平均值avg是满足条件的
for(int i = 0, j = m; j <= n; j++, i++){
mmin = min(mmin, sum[i]);
if(sum[j] - mmin >= 0) return true;
}
return false;
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)scanf("%d", &num[i]);
// 对给定的范围进行浮点数二分查找结果
double l = 1, r = 2000;
while(r - l > 1e-5){
double mid = (l+r)/2;
if(check(mid))l = mid;
else r = mid;
}
printf("%d\n",int(r*1000));
return 0;
}
边栏推荐
猜你喜欢
随机推荐
EMQX Newsletter 2022-07|EMQX 5.0 正式发布、EMQX Cloud 新增 2 个数据库集成
MySQL窗口函数 PARTITION BY()函数介绍
超分重建数据集
通俗理解apt-get 和pip的区别是什么
php之相似文章标题similar_text()函数使用
Web3的开源为何会如此受到人们喜爱?
为何微博又双叒叕崩溃了?
学会 Arthas,让你 3 年经验掌握 5 年功力!
C专家编程 第3章 分析C语言的声明 3.8 理解所有分析过程的代码段
使用Stream多年,collect还有这些“骚操作”?
自动化部署+整合SSM项目
yolov5s用自己的数据集进行训练模型
SwinIR实战:如何使用SwinIR和预训练模型实现图片的超分
protobuf 反射使用总结
Auto Scaling 弹性伸缩(运维释放人力)
Hannah荣获第六季完美童模全球总决赛全球人气总冠军
LeetCode·72.编辑距离·动态规划
Huawei, Lenovo, BAIC, etc. were selected as the first batch of training bases for "Enterprise Digital Transformation and Security Capability Improvement" by the Ministry of Industry and Information Te
FinClip | 2022 年 7 月产品大事记
Excuse me this hologres dimension table is cached?How to Finished








