补题报告————最佳牛围栏

错误题目:最佳牛围栏

最佳牛围栏

时间限制:1秒        内存限制:128M

题目描述

  农夫约翰的农场由 N块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头。约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。围起区域内至少需要包含 F块地,其中 F 会在输入中给出。在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。1≤N≤100000,1≤F≤N  

输入描述

第一行输入整数 N 和 F ,数据间用空格隔开。接下来 N行,每行输出一个整数,第i+1行输出的整数代表,第i片区域内包含的牛的数目。

输出描述

输出一个整数,表示平均值的最大值乘以1000再 向下取整 之后得到的结果。  

样例

输入

10 6

6

4

2

10

3

8

5

9

4

1

输出

6500

思路:初看到此题时,直接就跟不知道怎么做,接着就想起来了二分,然后就想都没想就写代码了,知道写到最后才发现根本用不了,因为他连使用二分的第二条都不行,跟别说整体了,直接就没思路了,

二分的五个步骤:

  1. 确定使用二分;
  2. 确定二分对象;
  3. 确定二分范围;
  4. 编写二分代码;
  5. 编写jisuan函数;

再次思考题目之后,发现好像要求平均值,然后就想到了最快去取一组值的方法是生成使用前缀和数组,然后就想都没想去打前缀和代码了……,提交代码——答案错误,再看一下题目的最后一句话”计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。”最大值,平均值都没看到,再提交——答案错误,发现要使用滑动窗口……

总结:本题主要考察三个知识点:

  1. 平均值前缀和数组;
  2. 滑动窗口解法;
  3. 二分思想;

AC代码:

#include<cmath>

#include<cstdio>

#include<string>

#include<iomanip>

#include<iostream>

#include<algorithm>

using namespace std;

const int N=1e5+10 ;

int f,n,a[N];

double sum[N];

bool fun(double mid) {

for(int i=i; i<=n; i++) {

sum[i]=sum[i-1]+a[i]-mid;

}

double mi=N;

for(int i=0,j=f; j<=n; i++; j++) {

mi=min(sum[i-1],mi);

if(sum[j]-mi>=0) {

return 1;

}

}

return 0;

}

int main() {

cin>>n>>f;

for(int i=1; i<=n; i++) {

cin>>a[i];

}

double l=1,r=2000;

while(abs(r-l)>1e-5) {

double mid=(l=r)/2;

if(fun(mid)) {

l=mid;

}

else {

r=mid;

}

}

cout<<(int)(r*1000)<<endl;

}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值