📜  门| GATE CS 2021 |设置 1 |第 50 题(1)

📅  最后修改于: 2023-12-03 15:42:12.706000             🧑  作者: Mango

题目介绍

这道题目是GATE CS 2021考试中设置的第50题,属于算法和数据结构的题目。本题需要考察程序员在编写程序时使用数组和循环结构的能力。

题目描述

给出一个由$n$个整数组成的数组$A$和一个整数$k$。数组$B$的大小为$n-k-1$,其每个元素为$A$数组中对应位置之后的$k+1$个元素的平均值。请编写一个程序,计算出$B$数组的每个元素。

输入格式

输入第一行为一个整数$n$,表示数组$A$的长度。

输入第二行为$n$个整数,表示数组$A$。

输入第三行为一个整数$k$。

输出格式

输出一个长度为$n-k-1$的数组$B$。

输入样例
6
1 2 3 4 5 6
2
输出样例
3 4 5
解题思路

对于每个元素$A[i]$,需要求解A[i + 1] … A[i + k]的平均值。这个平均值可以使用一个固定长度为$k + 1$的窗口,每次窗口向后平移一位,来计算。同时,由于只需要求出平均数,可以使用滑动窗口方法,将平均数计算的时间复杂度降为$O(1)$。最后得到的平均数就是数组$B$中的元素。

代码实现

Python代码实现如下:

n = int(input())
a = list(map(int, input().split()))
k = int(input())

# 滑动窗口初始化
window_sum = sum(a[:k+1])
result = [window_sum/(k+1)]

# 滑动窗口计算每个平均值
for i in range(k+1, n):
    window_sum += a[i] - a[i-k-1]
    result.append(window_sum/(k+1))

print(' '.join(map(str, result)))

C++代码实现如下:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n, k;
    cin >> n;
    vector<int> a(n);
    for (auto& x : a) cin >> x;
    cin >> k;

    // 滑动窗口初始化
    int window_sum = 0;
    for (int i = 0; i <= k; i++)
        window_sum += a[i];
    cout << static_cast<double>(window_sum)/static_cast<double>(k+1) << ' ';

    // 滑动窗口计算每个平均值
    for (int i = k+1; i < n; i++)
    {
        window_sum += a[i] - a[i-k-1];
        cout << static_cast<double>(window_sum)/static_cast<double>(k+1) << ' ';
    }
    cout << endl;
    return 0;
}