2018暑假集训Problem Archive #1K题题解和感悟

K题

题目大意

题目链接
给你一个大小为n的数组a,和数字k,求数组a中大小大于等于k的子数组的最大平均值


分析

先用一个循环来遍历子数组的头部,注意循环结束的条件,i<=n-k。再用一个循环来遍历子数组的尾部,对于每一个子数组,求出它的平均值,并不断更新,存储最大的平均值。但注意到题目中n和k的数据都比较大,在代码1中每次都去遍历子数组来求和,最终导致在第13个测试数据中就超时了,所以这道题就要用到前缀和来计算,在输入数据的时候就用另外一个数组来存储前i个数据的和,这样在求子数组和的时候就可以用sum=result[j+1]-result[i]直接求出和,简化了复杂度。


代码1

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#define MAX_N 5000+5
using namespace std;
int main(int argc, char const *argv[])
{
    int n,k;
    int number[MAX_N];
    double res1,res2=0;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&number[i]);
    }
    for(int i=0;i<=n-k;i++)
    {
        for(int j=i+k-1;j<n;j++)
        {
            double sum=0;
            for(int m=i;m<=j;m++)
            {
                sum+=number[m];
            }
            res1=sum/(j-i+1);
            if(res1>res2)
                res2=res1;
        }
    }
    printf("%.15llf\n",res2);
    return 0;
}

代码2

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#define MAX_N 5000+5
using namespace std;
int main(int argc, char const *argv[])
{
    int n,k;
    int number[MAX_N];
    int result[MAX_N];
    result[0]=0;
    double res1,res2=0;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&number[i]);
        result[i+1]=result[i]+number[i];
    }
    for(int i=0;i<=n-k;i++)
    {
        for(int j=i+k-1;j<n;j++)
        {
            double sum=result[j+1]-result[i];
            res1=sum/(j-i+1);
            if(res1>res2)
                res2=res1;
        }
    }
    printf("%.15llf\n",res2);
    return 0;
}

总结
前缀和很重要

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,457评论 0 2
  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    医学工程与科学园地阅读 1,254评论 0 1
  • 从春夏到秋冬 由严寒到酷暑 时光未老 我们 也没有散 蜿蜒盘旋的通天路上 历尽坎坷 终会到达你的高度 兢兢业业 只...
    王盛红阅读 201评论 0 1
  • 2018-1-19 晴 昨晚的家庭朗读会,因为爸爸的缺席没有正常举行。在临睡前,我和儿子还是每人坚持读了...
    甜蜜蜜DY阅读 308评论 1 3
  • 大半年没来磨山,发现磨山已经免收门票了。磨山秋色的美,适合治疗秋天的萧瑟!
    容玲阅读 237评论 0 1