Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2013, 22:13   #1
Beny Benassi
 
Регистрация: 07.11.2013
Сообщений: 3
По умолчанию Олимпиадная задача

Приветствую,форумчане. Готовлюсь в олимпиаде по информатике. Никак не могу разобратсья с такой программой:



Задача 3 Удачная покупка (50 баллов)
Имя входного файла: shopping.in
Имя выходного файла: shopping.out
Максимальное время работы на одном тесте: 2 секунды
Ограничение по памяти: 64 MB
Недавно Петя решил купить себе цифровой фотоаппарат. Зайдя на сайт любимого магазина, он обнаружил в продаже огромное количество фотоаппаратов. Потратив целый день, и совершенно отчаявшись что-либо выбрать, Петя обратился за помощью к своему другу Васе. А Вася очень любит математику. Он сразу же объяснил Пете, как надо выбирать фотоаппарат:
В продаже имеется N фотоаппаратов, причем цены на все фотоаппараты различны. Вася предлагает расположить все фотоаппараты в порядке возрастания их стоимости и купить пятый с начала этого списка фотоаппарат.
Формат входных данных
Первая строка входного файла содержит целое число N (5 <= N <= 100000) – количество моделей фотоаппаратов, имеющихся в продаже. Затем идет 2N строк: сначала N строк с названиями моделей, затем N строк с ценами соответствующих фотоаппаратов. Название модели фотоаппарата – это непустая последовательность не более чем из 30 латинских символов, цифр, дефисов и пробелов. Цена фотоаппарата – целое положительное число не превышающее 1000000000.
Формат выходных данных
В текстовый файл shopping.out выведите название модели фотоаппарата, который Петя должен купить.
Вход
6
Nikon D80 Kit Вывод Pentax K20D Kit
Canon EOS 450D Kit
Nikon D40 Kit
Canon EOS 50D Body
Sony Alpha DSLR-A200 Kit
Pentax K20D Kit
23000
19550
14800
38336
15300
28000

Массив созджавать не вариант. Думал, считывать название, спускаться до цен(цикл с readln - смена положения курсора) но поднять его потом нельзя, так что и этот вариант выпадает. ЧТо делать?
Beny Benassi вне форума Ответить с цитированием
Старый 07.11.2013, 22:21   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Массив не будет проходить по времени..
А память давайте считать..
У нас есть 64 МБ
Максимум, что может быть это
(31 + 4) * 1024 * 1024 = 35 МБ, так что проходим..

Вас спасет поиск K-ой статистики..
Так что создаем массив структур и не паримся..

UPDATE

А хотя я ошибся.. У нас есть 2 секунды..
А максимум фотиков 100 000, а выполнять может за одну секунду может до 20 000 000 (на среднестатистическом компе)..

Последний раз редактировалось Poma][a; 07.11.2013 в 22:30.
Poma][a вне форума Ответить с цитированием
Старый 07.11.2013, 22:27   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Ну так можно в начало файла прыгнуть, или все таки массив, который займет 3000000 байт, что меньше 64Мб.
Arigato вне форума Ответить с цитированием
Старый 07.11.2013, 22:32   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Думаю, что от массива отказываться нельзя. Вот только его надо сделать двумерным и на пять элементов (всего - десять).
В одной размерности храним цену, а во второй - номер в последовательности.
Алгорит получается такой:
1. Читаем первое число.
2. Пропускаем строки на это число.
3. Читаем первые пять ценников и пишем их в массив с порядковым номером. Сортируем. Обратите внимание, что цены все разные.
4. Продолжаем чтение до конца и всавляем в массив цены, которые больше пятого элемента. Не забываем про запись порядкового номера цены. Вставку можно делать бинарным поиском.
5. После прочтения всего файла в пятом элементе нужная нам цена и порядковый номер фотоаппарата.
6. Переоткрываем файл и читаем запись, которая располагается в позиции на 1 больше, чем порядковый номер фотоаппарата.

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 07.11.2013, 22:45   #5
Beny Benassi
 
Регистрация: 07.11.2013
Сообщений: 3
По умолчанию

Открывать файл можно только 1 раз.И да, ведь если пропустить названия, отсортировать в массиве цены, то курсор наверх уже не вернуть.
Только в некоторых версиях Паскаля допускается создание массива на такое количество символов, в остальных пишет, что массив слишком большой

Последний раз редактировалось Beny Benassi; 07.11.2013 в 22:47.
Beny Benassi вне форума Ответить с цитированием
Старый 07.11.2013, 23:03   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ViktorR, я тоже (вначале) думал именно такой алгоритм использовать!
Ну, я бы завёл тип record из двух полей (в одном название string[30], во втором цена LongInt).
Но есть один нехороший (мерзкий) нюансик.
Сначала идёт сто тысяч (в максимуме) названий, потом столько же - цен.
Поэтому не получится прочитать первый пять названий и первых пять цен!

Поэтому, решаем в лоб - заводим массив на сто тысяч записей, читаем туда все фотики и их цены, ну и дальше обрабатываем их...

Код:
Только в некоторых версиях Паскаля допускается создание массива на такое количество символов, в остальных пишет, что массив слишком большой
нормальные, современные компиляторы (FPC, Delphi) создадут такой массив без всяких проблем.
Если же стоит задача использовать древний TurboPascal - смотрите в сторону использования динамической памяти.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.11.2013, 23:05   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А временный файл в условии нет запрета создавать? Читаем за один прогон, строки во временный файл, цены и позиции как ViktorR предложил. В конце нужное наименование из временного файла читаем
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.11.2013, 23:06   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Цитата:
Открывать файл можно только 1 раз.
А с чего это следует? Ткните, где это требование изложено.
В каждом конкретном случае такое требование должно быть представлено, если оно важно.
Можно или нельзя открывать файл повторно - это обязательное условие задачи. Если это условие отсутствует, то значит можно открывать неоднократно.
Просто на это тратится дополнительное время.
С другой стороны, прочитайте первое число. Прочитайте файл один раз и все данные перепишите в два временных файла. Затем в одном из них выбираете цену и зная порядковый номер, лезете во второй.
Но это так, ...


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 07.11.2013, 23:09   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Serge_Bliznykov
Цитата:
Но есть один нехороший (мерзкий) нюансик.
Сначала идёт сто тысяч (в максимуме) названий, потом столько же - цен.
Поэтому не получится прочитать первый пять названий и первых пять цен!
Юмор в том, что названия надо просто пропустить.
Читаем только цены и сохраняем подходящие с их порядковым номером.
Вот потом, используя порядковый номер, читаем название.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 07.11.2013, 23:10   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
А с чего это следует? Ткните, где это требование изложено.
В каждом конкретном случае такое требование должно быть представлено, если оно важно.
Можно или нельзя открывать файл повторно - это обязательное условие задачи. Если это условие отсутствует, то значит можно открывать неоднократно.
да. кстати. согласен!

Beny Benassi, с чего Вы взяли, что файл нельзя открыть повторно?!!


Цитата:
Сообщение от ViktorR
Юмор в том, что названия надо просто пропустить.
Читаем только цены и сохраняем подходящие с их порядковым номером.
Вот потом, используя порядковый номер, читаем название.
угу! согласен!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Олимпиадная задача. (C#) Nekro95 Помощь студентам 4 20.10.2013 14:39
олимпиадная задача quade1992 Паскаль, Turbo Pascal, PascalABC.NET 0 17.05.2012 18:57
Олимпиадная задача Sanek_ntsk Помощь студентам 4 09.11.2011 23:03
Олимпиадная задача. _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 1 09.12.2010 20:53
Олимпиадная задача Carbon Общие вопросы C/C++ 2 23.05.2007 22:07