Форум программистов, компьютерный форум CyberForum.ru

Задача на дп (олимпиадная) - C++

Восстановить пароль Регистрация
 
Mngame
Сообщений: n/a
02.12.2012, 15:35     Задача на дп (олимпиадная) #1
Здравствуйте, имеется данная задача, основная проблема состоит в том, что мое решение никак не проходит по времени. Пробовал писать через map / set / vector / простой дин.массив. Не проходит! Понимаю, что нужно до чего-то догадаться, не выходит. Очень прошу разъяснить, а если не лень, то написать программу
Поясню, что данная задача не входит в какую либо контрольную или еще что-то, это разбор прошлой олимпиады.
За помощь огромное спасибо.
Кликните здесь для просмотра всего текста


Ограничение по времени 1 секунда на тест

В течение всего года бассейн «Золотая рыбка» пользуется большой популярностью у спортсменов и любителей плавания. Его раздевалка состоит из бесконечного числа одноместных шкафчиков, пронумерованных натуральными числами. В течение дня постоянно занимающиеся спортсмены по прибытии занимают заранее выбранные ими шкафчики. Если выбранный спортсменом шкафчик свободен, то спортсмен занимает его. В противном случае спортсмен занимает первый свободный шкафчик с большим номером. Некоторые спортсмены заканчивают свою тренировку, исходя из индивидуального графика, и освобождают свой шкафчик досрочно. Сразу после ухода спортсмена его шкафчик становится доступным вновь пришедшему спортсмену.
Cмоделируйте работу работника reception, ответственного за распределение мест в раздевалке, и научитесь быстро сообщать прибывающим спортсменам, каким шкафчиком им следует воспользоваться.

Формат входного файла.
В первой строке входного файла число n – количество прибытий и убытий в течение дня (n<=100000). Следующие n строк содержат информацию о приходящих и уходящих спортсменах. Число k>0 обозначает, что прибыл спортсмен, который желает занять шкафчик с номером k (k<=100000). Число k<0, означает, что освобождается шкафчик под номером k, который занимал спортсмен, окончивший тренировку. (Гарантируется, что этот шкафчик не был пуст).

Формат выходного файла.
Для каждого прибывающего спортсмена выведите одно натуральное число – номер шкафчика, которым он может воспользоваться.

Пример файла входных данных и файла с результатом.

d.in
6
5
5
5
-6
5
5


d.out
5
6
7
6
8


Добавлено через 2 часа 5 минут
Никто не в силах?

Добавлено через 2 часа 6 минут
Ребят, идейку
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2012, 15:35     Задача на дп (олимпиадная)
Посмотрите здесь:

Олимпиадная задача C++
C++ Олимпиадная задача
Олимпиадная задача C++
C++ Олимпиадная задача
C++ Олимпиадная задача. Рыбаки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.12.2012, 15:52     Задача на дп (олимпиадная) #2
Покажите вашу реализацию, что-ли.
Mngame
Сообщений: n/a
02.12.2012, 16:56     Задача на дп (олимпиадная) #3
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
#include <fstream>
 
 
using namespace std;
 
bool a[200001];
 
int find(int x)
{
    while (a[x]) x++;
    return x;
}
 
int main()
{
    ifstream in("d.in");
    ofstream out("d.out");
    int n,command;
    in >> n;
    memset(a, false, 200001);
    for (int i = 0; i < n; i++) {
       in >> command;
       if (command < 0) {
              command = - command;
              a[command] = false;
       }
       else if (a[command] == true) {
                 command = find(command+1);
                 a[command] = true;
                 out << command << endl;
            }
            else
            {
                a[command] = true;
                out << command << endl;
            }
    }
 
 
    return 0;
}
Не поверите, но самая быстрая моя реализация, максимальный тест 5 сек делает. Вся динамика шла за 10сек.
Sunrise7463
Сообщений: n/a
18.01.2013, 18:18     Задача на дп (олимпиадная) #4
если коротко-нужно составить бинарное дерево из логических переменных с проверкой условия(медиана больше номера необходимого шкафчика),где последние листья-это шкафчики,и "заполнять" ветку,когда шкафчик найден.
т.е. если первый и второй шкафчик заняты их узел тоже занят
т.о. когда первые 5000 шкафчиков заняты ты не перебираешь заново,а уже в самом начале дерева переходишь на правую ветку
если сделаю код-пришлю(сделаю на паскале)
Yandex
Объявления
18.01.2013, 18:18     Задача на дп (олимпиадная)
Ответ Создать тему
Опции темы

Текущее время: 01:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru