|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.11.2013, 22:13 | #1 |
Регистрация: 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 - смена положения курсора) но поднять его потом нельзя, так что и этот вариант выпадает. ЧТо делать? |
07.11.2013, 22:21 | #2 |
Новичок
Джуниор
Регистрация: 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. |
07.11.2013, 22:27 | #3 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,551
|
Ну так можно в начало файла прыгнуть, или все таки массив, который займет 3000000 байт, что меньше 64Мб.
E-Mail: arigato.freelance@gmail.com
|
07.11.2013, 22:32 | #4 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,309
|
Думаю, что от массива отказываться нельзя. Вот только его надо сделать двумерным и на пять элементов (всего - десять).
В одной размерности храним цену, а во второй - номер в последовательности. Алгорит получается такой: 1. Читаем первое число. 2. Пропускаем строки на это число. 3. Читаем первые пять ценников и пишем их в массив с порядковым номером. Сортируем. Обратите внимание, что цены все разные. 4. Продолжаем чтение до конца и всавляем в массив цены, которые больше пятого элемента. Не забываем про запись порядкового номера цены. Вставку можно делать бинарным поиском. 5. После прочтения всего файла в пятом элементе нужная нам цена и порядковый номер фотоаппарата. 6. Переоткрываем файл и читаем запись, которая располагается в позиции на 1 больше, чем порядковый номер фотоаппарата. Как-то так, ...
Как-то так, ...
|
07.11.2013, 22:45 | #5 |
Регистрация: 07.11.2013
Сообщений: 3
|
Открывать файл можно только 1 раз.И да, ведь если пропустить названия, отсортировать в массиве цены, то курсор наверх уже не вернуть.
Только в некоторых версиях Паскаля допускается создание массива на такое количество символов, в остальных пишет, что массив слишком большой Последний раз редактировалось Beny Benassi; 07.11.2013 в 22:47. |
07.11.2013, 23:03 | #6 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
ViktorR, я тоже (вначале) думал именно такой алгоритм использовать!
Ну, я бы завёл тип record из двух полей (в одном название string[30], во втором цена LongInt). Но есть один нехороший (мерзкий) нюансик. Сначала идёт сто тысяч (в максимуме) названий, потом столько же - цен. Поэтому не получится прочитать первый пять названий и первых пять цен! Поэтому, решаем в лоб - заводим массив на сто тысяч записей, читаем туда все фотики и их цены, ну и дальше обрабатываем их... Код:
Если же стоит задача использовать древний TurboPascal - смотрите в сторону использования динамической памяти. |
07.11.2013, 23:05 | #7 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А временный файл в условии нет запрета создавать? Читаем за один прогон, строки во временный файл, цены и позиции как ViktorR предложил. В конце нужное наименование из временного файла читаем
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
07.11.2013, 23:06 | #8 | |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,309
|
Цитата:
В каждом конкретном случае такое требование должно быть представлено, если оно важно. Можно или нельзя открывать файл повторно - это обязательное условие задачи. Если это условие отсутствует, то значит можно открывать неоднократно. Просто на это тратится дополнительное время. С другой стороны, прочитайте первое число. Прочитайте файл один раз и все данные перепишите в два временных файла. Затем в одном из них выбираете цену и зная порядковый номер, лезете во второй. Но это так, ... Как-то так, ...
Как-то так, ...
|
|
07.11.2013, 23:09 | #9 | |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,309
|
Serge_Bliznykov
Цитата:
Читаем только цены и сохраняем подходящие с их порядковым номером. Вот потом, используя порядковый номер, читаем название. Как-то так, ...
Как-то так, ...
|
|
07.11.2013, 23:10 | #10 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
Beny Benassi, с чего Вы взяли, что файл нельзя открыть повторно?!! Цитата:
|
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Олимпиадная задача. (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 |