Вопрос № 41047: Здраствуйте ув. эксперты.
у меня возникла необходимость побитового представления файлов.
Есть ли стандартные процедуры, для этой цели?
Я конечно могу разбить на биты делением, но это будет глупой
тратой скорости проги: программа перев...Вопрос № 41075: Пожайлуста помогите с задачей?
Имя входного файла: advent.in
Имя выходного файла: advent.out
Максимальное время работы на одном тесте: 2 секунды
Максимальный объем используемой памяти: 64 мегабайта
Максимальная оценка 100 бал...
Вопрос № 41.047
Здраствуйте ув. эксперты.
у меня возникла необходимость побитового представления файлов.
Есть ли стандартные процедуры, для этой цели?
Я конечно могу разбить на биты делением, но это будет глупой
тратой скорости проги: программа переводит переменные программисту в десятичную систему, а потом обратно...
Отвечает: Форсман Павел Вячеславович
Здравствуйте, Dobrotsvetov_D_M!
Такой стандартной процедуры в Pascal нет!!! А зачем это вообще нужно???
Может быть я бы и смог что либо предложить...
Дамп файла каждый раз (его сначала нужно считать в память) сдвигать на разряд вообще бессмысленно, так что придется пользоваться обычным делением по модулю или конкретизировать задачу.
Касательно скорости, можно оптимизировать - например, вместо div написать shr 2 - должно работать быстрее.
С уважением, Форсман.
--------- Научить нельзя, но можно попробовать научиться!!!
Хотелось бы уточнить что Вы понимаете под термином "побитовое представление".
а) Если считать файл по битам то хоть как извращаться придется. Хотя со своей стороны могу предложить функции AND, OR, NOT, XOR, SHR, SHL как самые хорошие. А объясняется это просто: 86 процессоры имеют побайтовую адресацию везде и поэтому обратиться к биту можно только извращениями.
б) В терминологии C++ есть понятие побитового и текстового открытия файла. Аналогом в Pascal`е являются типизованные файлы. т.е. можно представить файл как массив byte.
Вот так:
var f:file of byte;
t:byte;
begin
assign (f,'1.pas');
reset (f);
while not eof(f) do
begin
read (f,t);
{ writeln (t); - тут обработчик}
end;
close (f);
end.
Ответ отправил: NiGHT (статус: Студент)
Ответ отправлен: 23.04.2006, 15:18 Оценка за ответ: 5 Комментарий оценки: Речь шла о (а). Спасибо!!! Хороший ответ.
Вопрос № 41.075
Пожайлуста помогите с задачей?
Имя входного файла: advent.in
Имя выходного файла: advent.out
Максимальное время работы на одном тесте: 2 секунды
Максимальный объем используемой памяти: 64 мегабайта
Максимальная оценка 100 баллов
Теплым весенним днем группа из N школьников-программистов гуляла в окрестностях города Кисловодска. К несчастью, они набрели на большую и довольно глубокую яму. Как это случилось — непонятно, но вся компания оказалась в этой яме.
Глубина ямы равна H. Каждый школьник знает свой рост по плечи hi и длину своих рук li. Таким образом, если он, стоя на дне ямы, поднимет руки, то его ладони окажутся на высоте hi + li от уровня дна ямы. Школьники могут, вставая друг другу на плечи, образовывать вертикальную колонну. При этом любой школьник может встать на плечи любого другого школьника. Если под школьником i стоят школьники j1, j2, …, jk, то он может дотянуться до уровня hj1 + hj2 + … + hjk + hi + li.
Если школьник может дотяноуться до края ямы (то есть hj1 + hj2 + … + hjk + hi + li ≥ H), то он может выбраться из нее. Выбравшиеся из ямы школьники не могут помочь оставшимся.
Найдите наибольшее количество школьников, которые смогут выбраться из ямы до прибытия помощи, и перечислите их номера.
Формат входных данных
В первой строке входного файла записано натуральное число N (1 ≤ N ≤ 2000) — количество школьников, попавших в яму.
Далее в N строках указаны по два целых числа: рост i-го школьника по плечи hi (1 ≤ hi ≤ 105) и длина его рук li (1 ≤ li ≤ 105).
В последней строке указано целое число — глубина ямы H (1 ≤ H ≤ 105).
Формат выходных данных
В первой строке выведите K — максимальное количество школьников, которые смогут выбраться из ямы. Если K > 0, то во второй строке в произвольном порядке выведите их номера, разделяя их пробелами. Школьники нумеруются с единицы в том порядке, в котором они заданы во входном файле. Если существует несколько решений, выведите любое.
Примеры
advent.in advent.out
2
10 4
5 2
20 0
6
6 7
3 1
8 5
8 5
4 2
10 5
30 4
1 4 2 5
Отправлен: 23.04.2006, 11:37
Вопрос задал: Lexa (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Полховский Александр Владимирович
Здравствуйте, Lexa!
Максимальное число выбравшихся получится тогда, когда в самом низу будут стоять самые высокие (h самое большое). Либо когда у самых последних низких самые длинные руки. Для этого надо сначала отсортировать весь коллектив по росту. Я бы посоветовал пользоваться масивом записей для хранения сведений о программистах.
array [1..N] of record
Height, Length: byte;
end;
Теперь всех, кто находится под чертой ямы (без рук) мы сортируем по сумме длин тел и рук. То есть длина тела и рук самого нижнего программиста (у него нет шансов :) ) должна быть самой маленькой из всех, кто не достаёт плечами до края ямы.
Всех, кто находится во второй группе (то есть те, у кого плечи выше уровня ямы), сортируем таким же образом.
Отсортировав, начинаем подбор других вариантов, при которых самые рукастые из самых низких могли бы заменить самых короткоруких из самых высоких. При этом этих самых долгоруких размещать нужно перед самым верхним школьником из тех, кто снизу. Ещё обязательно нужно учесть одно условие: общая длина нижнего школьника должна быть меньше или равна общей длине того, кем мы его заменяем.
Кажется, дальше без Ваших вариантов никуда. Надеюсь, помог.
--------- Спасём нашу хрупкую планету !