错误题目:最佳牛围栏
最佳牛围栏
时间限制: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
思路:初看到此题时,直接就跟不知道怎么做,接着就想起来了二分,然后就想都没想就写代码了,知道写到最后才发现根本用不了,因为他连使用二分的第二条都不行,跟别说整体了,直接就没思路了,
二分的五个步骤:
- 确定使用二分;
- 确定二分对象;
- 确定二分范围;
- 编写二分代码;
- 编写jisuan函数;
再次思考题目之后,发现好像要求平均值,然后就想到了最快去取一组值的方法是生成使用前缀和数组,然后就想都没想去打前缀和代码了……,提交代码——答案错误,再看一下题目的最后一句话”计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。”最大值,平均值都没看到,再提交——答案错误,发现要使用滑动窗口……
总结:本题主要考察三个知识点:
- 平均值前缀和数组;
- 滑动窗口解法;
- 二分思想;
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;
}