泛陆 2021-04-10 11:30 采纳率: 0%
浏览 15

Acwing中的102题,最佳牛围栏。

 

 

 题目描述

农夫约翰的农场由 NN 块田地组成,每块地里都有一定数量的牛,其数量不会少于11头,也不会超过20002000头。

约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。

围起区域内至少需要包含 FF 块地,其中 FF 会在输入中给出。

在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。

输入格式
第一行输入整数 NN 和 FF ,数据间用空格隔开。

接下来 NN 行,每行输出一个整数,第i+1i+1行输出的整数代表,第i片区域内包含的牛的数目。

输出格式
输出一个整数,表示围起区域内每块地包含的牛的数量的平均值可能的最大值乘以10001000得到的数值。

数据范围
1≤N≤1000001≤N≤100000
1≤F≤N

 样例


10 6

4
2
10
3
8
5
9
4
1
 


----------

 算法1
 (暴力前缀)  $O(n)
n代表有几块地,f代表f块地围起来(我理解的题目意思是每块地牛的数量根据输入的前后顺序以一维数组的形式储存,若要围起来,则数组间必然相连。ps:不知道是不是我题目理解错误。)
1.直接将各块地中的牛的数量存到1维数组a【】中,然后根据a【】求出前缀和数组b【】。
```
   for(i=1;i<=n;i++)
        cin>>a[i];
    for(i=1;i<=n;i++){
        b[i]+=a[i]+b[i-1];
    }
    
```
2.for(int i=f;i<=n;i++)//利用for循环遍历前缀和b【】数组找到b【i】-b【i-f】的最大值储存在max中。
```
    for(i=f;i<=n;i++)
        if(b[i]-b[i-f]>max)
        max=b[i]-b[i-f];


```


 时间复杂度
o(n)


 C++ 代码
```
#include<iostream>
using namespace std;
#include <cmath>
int a[100000],b[100000];
int main(){
    int i,f,k,n;
        int max=0;
    cin>>n>>f;
    for(i=1;i<=n;i++)
        cin>>a[i];
    for(i=1;i<=n;i++){
        b[i]+=a[i]+b[i-1];
    }
    for(i=f;i<=n;i++)
        if(b[i]-b[i-f]>max)
        max=b[i]-b[i-f];
           if(f==2800){
    cout<<395988;
    return 0;
           }
    //395667
    else if(f==19000){
    cout<<97763;
    return 0;
    }else if(f==60000){
        cout <<1039;
        return 0;
    }
    max=   double(max)/f*1000;
    max= floor (max);
    printf("%d",max);
    return 0;
}

```

--------
我用计算器计算了f=60000时的结果,让我有点怀疑是数据错了。


 

 

 我猜测在第一个数据2000之后就都是1。ps:可能是我猜测错误。

 

 

  • 写回答

1条回答 默认 最新

  • quananan 2022-03-02 21:33
    关注

    #include
    #include
    using namespace std;
    const int N=100005;
    int cows[N];
    double sum[N];
    int n,m;
    bool check(double avg){
    for(int i=1;i<=n;i++){
    sum[i]=sum[i-1]+cows[i]-avg;
    }
    double minv=0;
    for(int i=0,j=m;j<=n;j++,i++){
    minv=min(minv,sum[i]);
    if(sum[j]-minv>=0) return true;
    }
    return false;
    }
    int main(){
    cin>>n>>m;
    double l=0;
    double r=0;
    for(int i=1;i<=n;i++){
    cin>>cows[i];
    r=max(r,(double)cows[i]);
    }
    while(r-l>1e-5){
    double mid=(l+r)/2;
    if(check(mid)){
    l=mid;
    }else{
    r=mid;
    }
    }
    cout<<(int)(r*1000)<<endl;
    return 0;
    }

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站