Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
3 / 3 / 2
Регистрация: 18.05.2014
Сообщений: 203

Требуется для каждого положения “окна” определить минимум в нём

06.02.2015, 22:03. Показов 1913. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрвствуйте, есть ли в стандартных библотеках функция типа make_heap, но наоборот, чтобы куча была от меньшего к большему, нужно для задачи:
Рассмотрим последовательность целых чисел длины N. По ней с шагом 1 двигается “окно” длины K, то есть сначала в “окне” видно первые K чисел, на следующем шаге в “окне” уже будут находиться K чисел, начиная со второго, и так далее до конца последовательности. Требуется для каждого положения “окна” определить минимум в нём.

Я так понял тут нужно составлять для каждого такого отрезка кучу с минималкой в вершине и так до элемента с индексом N-K, сложность будет N*logN , так что по времени пройдет
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.02.2015, 22:03
Ответы с готовыми решениями:

Требуется для каждого положения “окна” определить минимум в нём
помогите пожалуйста решить задачу Рассмотрим последовательность целых чисел длины N. По ней с шагом 1 двигается “окно” длины K, то...

Требуется для каждого положения «окна» определить минимум в нём
Рассмотрим последовательность целых чисел длины N. По ней с шагом 1 двигается «окно» длины K, то есть сначала в «окне» видно первые K...

Для каждого столбца матрицы определить, имеются ли в нем элементы, > b, и имеются ли в нем нечетные элементы
Ребятушки выручайте, очень надо) 2) Дан двумерный массив целых чисел. Для каждого его столбца выяснить: а) имеются ли в нем...

5
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
06.02.2015, 22:33
Цитата Сообщение от maksvolf96 Посмотреть сообщение
типа make_heap, но наоборот, чтобы куча была от меньшего к большему
Есть вторая версия make_heap, которая принимает компаратор.
C++
1
2
3
4
5
    
int myints[] = {10, 20, 30, 5, 15};
std::vector<int> v(myints, myints+5);
 
std::make_heap(v.begin(), v.end(), std::greater<int>());
1
3 / 3 / 2
Регистрация: 18.05.2014
Сообщений: 203
06.02.2015, 23:22  [ТС]
Вот 2 решения: одно самопис, второе через make_heap,оба по времени не проходят половину тестов, как её иначе можно решить (бинарный поиск не продлагать)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//Решение не проходящее по времени
 
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
 
using namespace std;
 
void BuildHeap(vector <int> &Heap,int f,int l)
{
    for(int i=l/2-1;i>=f;i--){
               int j=i;
        while(j*2 <=l-1 && Heap[j]>min(Heap[2*j+1],Heap[2*j+2]) )
                 if(Heap[2*j+1]<Heap[2*j+2]){
                        if(2*j+1>l-1)
                        break;
                    swap(Heap[j],Heap[2*j+1]);
                    j=2*j+1;
                 }
                 else{
                     if(2*j+2>l-1){
                         if(2*j+1==l-1 && Heap[2*j+1]<Heap[j])
                         swap(Heap[j],Heap[2*j+1]);
                     break;
                     }
                 swap(Heap[j],Heap[2*j+2]);
                 j=2*j+2;
                 }
        }
}
 
int main()
{
    int N;
    int K;
    cin >> N >> K;
    int help;
 
    vector <int> Heap;
   // vector <int> intK(K);
 
    for(int i=0;i<N;i++){
        cin >> help;
        Heap.push_back(help);
    }
 
   for(int i=0;i<=N-K;i++){
        if(K+i-1<=N-1){
    vector <int> intK(Heap.begin()+i,Heap.begin()+K+i);
 
    BuildHeap(intK,0,K);
         cout << intK[0] << endl;
        }
   }
 
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
 
using namespace std;
 
int main()
{
    int N;
    int K;
    cin >> N >> K;
    int help;
 
    vector <int> Heap;
   // vector <int> intK(K);
 
    for(int i=0;i<N;i++){
        cin >> help;
        Heap.push_back(help);
    }
 
   for(int i=0;i<=N-K;i++){
        if(K+i-1<=N-1){
                vector <int> intK(Heap.begin()+i,Heap.begin()+i+K);
    make_heap(intK.begin(),intK.end(),std::greater<int>());
         cout << intK[0] << endl;
        }
   }
 
 
}
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
07.02.2015, 00:31
maksvolf96, Таска же не много поточная? Тогда вы что-то совсем заизвращались с алгоритмом и делаете одну работу К раз.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int main()
{
    int n = 10;
    int k = 2;
 
    std::vector<int> magicArray(n);
    std::generate(magicArray.begin(), magicArray.end(), [](){return rand()%100;});
 
    std::copy(magicArray.begin(), magicArray.end(), std::ostream_iterator<int>(std::cout, ","));
    std::cout << std::endl;
 
    std::vector<int>::iterator minEl = std::min_element(magicArray.begin(), magicArray.begin() + k);
    int pos = minEl - magicArray.begin();
    std::cout << *minEl << std::endl;
 
    for (int i = 1; i <= n - k; i++)
    {
        if (pos < i)
        {
            minEl = std::min_element(magicArray.begin() + i, magicArray.begin() + i + k);
            pos = minEl - magicArray.begin();
        }
        else if (magicArray[i + k - 1] <= *minEl)
        {
            pos = i + k - 1;
            minEl = magicArray.begin() + pos;
        }
        std::cout << *minEl << std::endl;
    }
 
    return 0;
}
1
3 / 3 / 2
Регистрация: 18.05.2014
Сообщений: 203
07.02.2015, 03:20  [ТС]
1 тест не проходит, я могу только попытаться угадать какой:
У нас N элементов, длина подмассива K элементов и если мы будем искать в полностью упорядоченном массиве, то сложность составит O(N-K)*O(min_element) , в следствие чего я делаю вывод, что min_element работает за линейное время...
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,750
Записей в блоге: 10
07.02.2015, 14:28
Цитата Сообщение от maksvolf96 Посмотреть сообщение
vector <int> intK(Heap.begin()+i,Heap.begin()+i+K);
make_heap(intK.begin(),intK.end(),std::g reater<int>());
Проще сразу найти минимум перебором, сложность такая же как при создании вектора intK.

Добавлено через 2 часа 32 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include <limits.h>
 
int* t;
// ïîñòðîåíèå äåðåâà îòðåçêîâ. Ñëîæíîñòü O(n)
void build (int* a, int v, int tl, int tr) {
    if (tl == tr)
        t[v] = a[tl];
    else {
        int tm = (tl + tr) / 2;
        build (a, v*2, tl, tm);
        build (a, v*2+1, tm+1, tr);
        t[v] = std::min(t[v*2], t[v*2+1]);
    }
}
// íàõîæäåíèå ìèíèìóìà â äåðåâå îòðåçêîâ. Ñëîæíîñòü O(log n)
int minimum (int v, int tl, int tr, int l, int r) {
    if (l > r)
        return INT_MAX;
    if (l == tl && r == tr)
        return t[v];
    int tm = (tl + tr) / 2;
   int minL = minimum (v*2, tl, tm, l, std::min(r,tm));
   int minR = minimum (v*2+1, tm+1, tr, std::max(l,tm+1), r);
    return std::min(minL, minR);
}
#pragma argsused
 
 
int main(int argc, char* argv[])
{
   srand(time(0));
   int const n = 10, k = 4;
   
   int* a = new int[n];
    for(int i = 0; i < n; ++i)
    {
        a[i] = rand() % 100 - 30;
        std::cout << a[i] << "  ";
    }
    std::cout << '\n';
    
    t = new int[n * 4]; // äåðåâî îòðåçêîâ
    memset(t, 0, n*4*4);
    build(a, 1, 0, n-1); // O(n)
 
    for (int i = 0; i <= n - k; i++)
    {
        int minVal = minimum(1, 0, n-1, i, i+k-1); // O(log n)
        std::cout << minVal << '\n';
    }
    std::cin.sync();
    std::cin.get();
    return 0;
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2015, 14:28
Помогаю со студенческими работами здесь

Для каждого столбца матрицы определить, имеются ли в нем элементы, большие числа q
Как программа для данной задачи будет выглядеть? - Дан массив целых чисел n x m. Для каждого столбца массива определить, имеются ли в нем...

Найти минимум строки и вычесть его из каждого элемента, потом также по столбцам если в нем нулей нет
Есть функция in_mas, которая помещает данные из стринггрида в динамический массив. И кнопка которая должна вывести результирующий массив в...

Для каждого элемента массива определить, сколько раз в нем встречается его минимальная цифра
Считать из текстового файла input.txt число N. Заполнить одномерный массив из N элементов случайными числами. Полученный массив вывести в...

Для каждого элемента массива определить, сколько раз в нём встречается его минимальная цифра
Не могу разобраться, накручена больно задача: Считать из файла число N. Заполнить одномерный массив из N элементов случайными числами....

Определить среднее арифметическое каждого столбца матрицы, определить максимум и минимум каждой строки
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; int main() { int aMatrix; float...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru