2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Минимум на отрезке (границы меняются)
Сообщение07.03.2015, 20:44 


24/12/14
82
Минск
Задача
   Рассмотрим последовательность целых чисел длины N. По ней с шагом 1 двигается “окно” длины K, то есть сначала в “окне” видно первые K чисел, на следующем шаге в “окне” уже будут находиться K чисел, начиная со второго, и так далее до конца последовательности. Требуется для каждого положения “окна” определить минимум в нём.
Входные данные
   Впервой строке входных данных содержатся два числа N и K ($1 \leqslant N \leqslant 150\, 000, 1 \leqslant K \leqslant 10\, 000, K \leqslant N$) – длины последовательности и “окна”, соответственно. На следующей строке находятся N чисел – сама последовательность.
Выходные данные
   Выходные данные должны содержать $ N - K + 1 $ строк – минимумы для каждого положения “окна”.

Ограничение по времени, сек: 1
Ограничение по памяти, мегабайт: 64


Проблема
Мой код "не влазит" в ограничение по времени (1,8 сек). Подскажите, пожалуйста, как улучшить алгоритм. Мой алгоритм прост: пройти по последовательности с окном, каждый раз находя в окне min.


код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
using namespace std;

int main()
{
        int N, K, min = 2147483647;
        cin >> N >> K;
        int *arr = new int[N];

        for (int i = 0; i<N; ++i)
                cin >> arr[i];

        for (int i = 0; i < N-K+1; ++i)
        {
                min = 2147483647;
                for (int j = i; j < i+K ; ++j)
                {
                        if (min>arr[j])
                                min = arr[j];
                }
                cout << min << endl;
        }

        return 0;
}
 

 Профиль  
                  
 
 Re: Минимум на отрезке (границы меняются)
Сообщение08.03.2015, 10:51 
Аватара пользователя


31/10/08
1244
Skyfall
А что у вас идей нет? Я как минимум знаю 2 идеи которые могут ускорить код.
1) Можно к примеру рассмотреть какое число добавилось и какое ушло. И на основе этого уже либо запускать поиск минимума в окне или не запускать.
2) Или второй вариант вычислить минимум в 2,4,8 и тд. Памяти много хватит. И тогда поиск в окне минимума будет не O(N), а O(Log(K)).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group