Skip to content

14150: 【原4150】MovingAverage

题目

题目描述

author: DS TA 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4150

Description

滑动平均法是一种简单的数据平滑技术,可以消除数据受到周期波动和随机变动的影响。给定一串整数和一个窗口大小,计算随着数据流动窗口内整数的平均值。

Input Format

输入文件m+1行。

第一行包括两个个正整数n,m。n是窗口大小,m是数据个数。(1<=n,m<=1000)

第2~m+1行包括m个int数据,代表输入的一串整数。

Output Format

输出文件包括一行内容,其中每个数据用空格隔开,代表窗口从第一个元素依次滑动到最后一个元素得到的一串平均值,向下取整。

Sample Input1

2 4
1
2
3
4

Sample Output1

1   (解释:此时窗口中有1,平均值为1。)
1   (解释:此时窗口中有1,2,平均值为1.5,向下取整为1。)
2   (解释:此时窗口中有2,3,平均值为2.5,向下取整为2。)
3   (解释:此时窗口中有3,4,平均值为3.5,向下取整为3。)

Sample Input2

4 7
1 
2
3
4
5
1
2

Sample Output2

1   (解释:此时窗口中有1,平均值为1。)
1   (解释:此时窗口中有1,2,平均值为1.5,向下取整为1。)
2   (解释:此时窗口中有1,2,3,平均值为2,向下取整为2。)
2   (解释:此时窗口中有1,2,3,4,平均值为2.5,向下取整为2。)
3   (解释:此时窗口中有2,3,4,5,平均值为3.5,向下取整为3。)
3   (解释:此时窗口中有3,4,5,1,平均值为3.25,向下取整为3。)
3   (解释:此时窗口中有4,5,1,2,平均值为3,向下取整为3。)

Limits

1.输入格式保证合法。

2.本题中先流入窗口的数据先流出窗口。因此请使用队列解题。

3.程序运行到最后一个数据进入窗口即可,不需要把队列中的数据清空。

satgo1546's solution

#include <iostream>
using namespace std;

int a[1001];

int main(int argc, char *argv[]) {
    int n, m;
    cin >> n >> m;
    int sum = 0;
    for (int i = 0; i < m; i++) {
        cin >> a[i];
        sum += a[i];
        if (i >= n) sum -= a[i - n];
        cout << sum / (i < n ? i + 1 : n) << endl;
    }
    return 0;
}