IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Олимпиадная задача
сообщение
Сообщение #1


Гость






В Берляндский ГУ поступила новая обучающая программа. Её надо скопировать на все N компьютеров. Сейчас она установлена только на первом. Компьютеры не объединены в локальную сеть и не снабжены дисководами. Единственный способ передать информацию с одного компьютера на другой - скопировать её, используя нуль-модем (провод, соединяющий два компьютера напрямую). К компьютеру может быть подключен в один момент времени только один нуль-модем. Таким образом, с любого компьютера, где установлена программа, её можно скопировать на какой-то другой (но только на один) всего за один час. В БерГУ есть всего K нуль-модемных шнуров. Ваша задача по заданным N и K найти наименьшее время, необходимое для копирования программы на все имеющиеся компьютеры.

Входные данные
В первой строке записаны через пробел числа N и K (1 <= N <= 10^9, 1 <= K <= 10^9).

Выходные данные
Выведите единственное число - наименьшее время (в часах), необходимое для копирования новой программы на все компьютеры.

Пример

Ввод

8 3


Вывод

4

какие предложения по решению???
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вот что полусилось

var
n,k,h,i : longint;
begin
n := 8;
k := 3;
h := 0;
i := 1;
repeat
if i < k then inc(i,i)
else inc(i,k);
inc(h);
until i >= n;
writeln(h);
readln;
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Эта задача полностью решается на листочке без всякого компьютера. Получается формула, которая дает ответ. Мне кажется, моделировать в таких случаях процесс не очень правильно - достаточно просто запрограммировать формулу (хотя конкретно в этом случае даже и этого не нужно - с любыми данными все решается на листочке за пару минут).
Формула следующая:

M=[(N-2^([log2(K)]+1)+1)/K] + [log2(K)]+2

Здесь log2 означает логарифм по основанию 2, квадратные скобки - целая часть.
Так что на эту задачу никакого респекта нету... no1.gif
Но я не поленился все же ее запрограммировать smile.gif. Вот текст:

var
n,k,i,l,m,s:integer;

begin
ReadLn(n,k);
l:=Trunc(ln(k)/ln(2));
s:=1; for i:=0 to l do s:=s*2; Dec(s);
m:=Trunc((n-s)/k)+l+2;
WriteLn(m);
end.



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


2 копма одним проводом 3 часа соединять ? не хорошо ... При n = 2, k=1 твоя программа врет yes2.gif

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Да, врет.. sad.gif
Только не прога, а формула. Я даже знаю, где врет. Я прокололся на краевых аффектах, на стыковке.
Сейчас перекушу - и подправлю...
Спасибо, Klem4 smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Ну вот и я поспел smile.gif
Сделал табличку для разных N K.
Прога:
Код
const max_n=20;
var n,k,r1,r0 :integer;
begin
  write('n\k ');
  for k:=1 to max_n-1 do write(k:3);
  writeln;
  for k:=1 to 4+(max_n-1)*3 do write('-');
  writeln;
  for n:=2 to max_n do
  begin
    write(n:2,'| ');
    for k:=1 to n-1 do
    begin
      r0:=Trunc(ln(k)/ln(2)+0.9999999999999);
      r1:=Trunc((N - 1 shl r0)/k+0.9999999999999);
      write( (r0 + r1):3 );
    end;
    writeln;
  end;
end.

Результат:
Код
n\k   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
-------------------------------------------------------------
2|   1
3|   2  2
4|   3  2  2
5|   4  3  3  3
6|   5  3  3  3  3
7|   6  4  3  3  3  3
8|   7  4  4  3  3  3  3
9|   8  5  4  4  4  4  4  4
10|   9  5  4  4  4  4  4  4  4
11|  10  6  5  4  4  4  4  4  4  4
12|  11  6  5  4  4  4  4  4  4  4  4
13|  12  7  5  5  4  4  4  4  4  4  4  4
14|  13  7  6  5  5  4  4  4  4  4  4  4  4
15|  14  8  6  5  5  5  4  4  4  4  4  4  4  4
16|  15  8  6  5  5  5  5  4  4  4  4  4  4  4  4
17|  16  9  7  6  5  5  5  5  5  5  5  5  5  5  5  5
18|  17  9  7  6  5  5  5  5  5  5  5  5  5  5  5  5  5
19|  18 10  7  6  6  5  5  5  5  5  5  5  5  5  5  5  5  5
20|  19 10  8  6  6  5  5  5  5  5  5  5  5  5  5  5  5  5  5


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Готово smile.gif
В формуле я наврал откровенно (спешил слишком - опаздывал в зал, играть sad.gif ).
Вот правильная:

M=[(N-2^([log2(K)]+1))/K] + [log2(K)] + Sign((N-2^([log2(K)]+1))-[(N-2^([log2(K)]+1))/K]*K)

Не пугайтесь последнего слагаемого (с Sign), он всего лишь означает, что нужно добавить единицу, если деление в первом слагаемом было не нацело smile.gif. В программе он реализован, ессно, простым оператором if.

Вот исправленный текст программы.

var
n,k,i,l,m,s:longint;

begin
ReadLn(n,k);
l:=Trunc(ln(k)/ln(2))+1;
s:=1; for i:=1 to l do s:=s*2;
m:=(n-s) div k;
if m*k<n-s then Inc(m);
Inc(m,l);
WriteLn(m);
end.


Я погонял ее в диапазоне LongInt, все результаты совпадали с результатами Klem4 smile.gif
Единственная разница - время, хотя и не очень значительно в этом диапазоне. Особенно долго программа klem4 работает при больших М и малых К - то есть при больших реальных временах копирования, как и должно быть при моделировании процесса. При М=2111111111 и К=1 она считала 7 сек на моей машине. Моя, ессно, практически мгновенно выдает ответ (там есть один цикл для подсчета степени двойки, но он очень короткий). Если арифметику еще удлинить, то разница только возрастет.
Конечно, процесс нахождения формулы тут представляет некоторый интерес, но только не для программирования.
Еще раз спасибо klem4 за найденную ошибку smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(hiv @ 27.01.2006 13:25) *

Ну вот и я поспел smile.gif

Извини, hiv, я не заметил твоего поста (не обновил экран). Формула очень похожа на мою (ессно, а что тут еще придумаешь? smile.gif ), но я не возьму в толк, как ты избежал этой проверки, которую мне пришлось вставить. За счет девяток?..
ага, понял. А ты не боишься что при больших М будут проблемы с точностью? Впрочем, вряд ли..
smile.gif Респект!


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 10.05.2024 2:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name