cpp题目描述有一天小 A 得到了一个长度为 n 的序列。他把这个序列的所有连续子序列都列了出来并对每一个子序列 都求了其平均值然后他把这些平均值写在纸上并对它们进行排序 最后他报出了第 k 小的平均值。你要做的就是模仿他的过程。输入格式第一行两个整数 nk意义如题中所述。第二行 n 个正整数即为小 A 得到的序列。输出格式一行一个实数表示第 k 小的平均值保留到小数点后 4 位。输入输出样例样例
思路:
- 首先读入n和k,并创建一个大小为n的数组存储序列。
- 读入序列中的n个数,并计算所有连续子序列的平均值,并将平均值存储在一个vector中。
- 对vector进行排序。
- 输出第k小的平均值,保留到小数点后4位。
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> sequence(n);
for (int i = 0; i < n; i++) {
cin >> sequence[i];
}
vector<double> averages;
for (int i = 0; i < n; i++) {
double sum = 0;
for (int j = i; j < n; j++) {
sum += sequence[j];
averages.push_back(sum / (j - i + 1));
}
}
sort(averages.begin(), averages.end());
cout << fixed << setprecision(4) << averages[k - 1] << endl;
return 0;
}
复杂度分析:
- 读入n和k的时间复杂度为O(1)。
- 读入序列中的n个数的时间复杂度为O(n)。
- 计算所有连续子序列的平均值的时间复杂度为O(n^2)。
- 对vector进行排序的时间复杂度为O(n^2logn)。
- 输出第k小的平均值的时间复杂度为O(1)。
- 总的时间复杂度为O(n^2logn)。
- 空间复杂度为O(n^2),用于存储所有平均值。
原文地址: http://www.cveoy.top/t/topic/i7yE 著作权归作者所有。请勿转载和采集!