首先,是从一个数组中选k个,就是滑动窗口的解法,而选一个最短的数组,我原有的方法是遍历被卡了,采用了大佬的方法二分,这道题还有一个关键点,必须排序,不排序过不了,方差公式是dx=ex2-ex的平方
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool checkWindow(vector<int> g, int end, int k, long long t) {
if (end + 1 < k) return false;
sort(g.begin(), g.begin() + end + 1);
long long sum = 0;
long long sum_sq7 = 0;
for (int i = 0; i < k; i++) {
sum += g[i];
sum_sq += (long long)g[i] * g[i];
}
if (sum_sq * k - sum * sum < (long long)k * k * t) {
return true;
}
for (int i = k; i <= end; i++) {
sum += g[i] - g[i - k];
sum_sq += (long long)g[i] * g[i] - (long long)g[i - k] * g[i - k];
if (sum_sq * k - sum * sum < (long long)k * k * t) {
return true;
}
}
return false;
}
int main() {
int n, k, t;
cin >> n >> k >> t;
vector<int> g(n);
for (int i = 0; i < n; i++) {
cin >> g[i];
}
int left = k - 1;
int right = n - 1;
int result = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (checkWindow(g, mid, k, t)) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
cout << (result != -1 ? result + 1 : -1) << endl;
return 0;
}