C/C++

Ещё один вопрос. Можете написать алгоритм к этой задаче(можно без кода, просто текстом)

Дима Ватрушин работает учителем алгебры в школе. За хорошую работу его отправили в отпуск на n дней. Дима давно мечтал съездить на горнолыжный курорт, поэтому он хочет выделить несколько дней подряд и отправиться кататься на лыжах. Так как поездка требует тщательной подготовки, то он готов поехать минимум на k дней. Вам дан массив a , содержащий прогноз погоды на курорте. То есть в i -й день температура будет равна ai градусов. Дима родился в Сибири, поэтому он сможет отправиться отдохнуть, только если температура не поднимется выше q градусов на протяжении всей поездки. К сожалению, Дима настолько увлекся абстрактной алгеброй, что разучился считать. Он просит вас помочь ему и посчитать количество способов выбрать даты отдыха на курорте. Входные данные В первой строке входных данных содержится целое число t (1≤t≤104 ) — количество наборов входных данных в тесте. Далее следуют описания наборов. В первой строке набора содержатся три целых числа n , k , q (1≤n≤2⋅105 , 1≤k≤n , −109≤q≤109 ) — длина массива a , минимальное количество дней на курорте и максимальная комфортная для Димы температура. Во второй строке набора содержится n целых чисел a1,a2,a3,…,an (−109≤ai≤109 ) — температура на горнолыжном курорте. Cумма значений n по всем наборам входных данных не превосходит 2⋅105 . Выходные данные Выведите t чисел, каждое из которых является ответом на соответствующий набор — количество способов Диме выбрать даты отдыха на курорте. Пример входные данныеСкопировать 7 3 1 15 -5 0 -10 5 3 -33 8 12 9 0 5 4 3 12 12 12 10 15 4 1 -5 0 -1 2 5 5 5 0 3 -1 4 -5 -3 1 1 5 5 6 1 3 0 3 -2 5 -4 -4 выходные данныеСкопировать 6 0 1 0 0 1 9 Примечание В первом наборе входных данных примера Дима может поехать в любой день, поэтому ему подходят даты [1], [2], [3], [1, 2], [2, 3], [1, 2, 3]. Во втором и четвертом наборах входных данных примера Дима не может поехать ни в какой день из-за высокой температуры, поэтому подходящих дат нет. В третьем наборе входных данных примера Дима может поехать только в даты [1, 2, 3].
Делим прогноз на интервалы, в которые температура не поднимается выше q. Пусть длина каждого интервала di
Тогда искомое количество будет равно sum(max(di-k,-1)+1).
Юрий Воробьев
Юрий Воробьев
67 511
Лучший ответ
Вот пример реализации этого алгоритма на C++:

```cpp
#include<bits/stdc++.h>
using namespace std;

void solve() {
int n, k, q;
cin >> n >> k >> q;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int cnt = 0;
int goodDays = 0;
for (int i = 0; i < n; i++) {
if (a[i] <= q) {
cnt++;
if (cnt >= k) {
goodDays++;
}
} else {
cnt = 0;
}
}
cout << goodDays << "\n";
}

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
```

Этот код сначала считывает количество тестовых случаев `t`, а затем для каждого тестового случая считывает `n`, `k`, `q` и массив `a`. Затем он итерирует по массиву `a`, проверяя каждый день и подсчитывая количество дней, когда температура не превышает `q`. Если счетчик дней достигает `k`, то количество подходящих дней увеличивается. Если встречается день, когда температура превышает `q`, то счетчик дней сбрасывается.

Заметьте, что условие задачи немного неоднозначно, и оно может подразумевать, что Дима может выбрать любой непрерывный подинтервал длины `k` или больше в массиве `a`, такой что все элементы в подинтервале не превышают `q`. В этом случае, решение выше работает правильно. Если же подразумевается, что Дима может выбрать только подинтервалы длины ровно `k`, то решение следует слегка модифицировать.
___________________________








#include<bits/stdc++.h>
using namespace std;

void solve() {
int n, k, q;
cin >> n >> k >> q;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int cnt = 0;
int left = 0; // левая граница окна
for (int right = 0; right < n; right++) { // правая граница окна
if (a[right] > q) {
if (right - left >= k) {
cnt += right - left - k + 1;
}
left = right + 1; // смещаем левую границу окна
} else if (right == n - 1) { // обработка конца массива
if (right - left + 1 >= k) {
cnt += right - left + 1 - k + 1;
}
}
}
cout << cnt << "\n";
}

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
~$$$$$$ $$$$$$~
~$$$$$$ $$$$$$~
14 368
Константин К Твой код на тест 5
1 2
2 1
2 2
10 2
179 100, выводит 0
0
99
99
99, а должен 2
2
3
4
180
Константин К ответь пожалуйста
Константин К что значит в шапке, у тебя тут код полный
Константин К просто он работает неправильно
Константин К мне не сильно нужен код, мне только хотя бы алгоритм, у меня 10 минут(