Другие языки программирования и технологии

Помогите решить задачу! на паскале!

В небольшой город Компьютеринск с 50-тысячным населением приехал в t часов m минут житель столицы и привез всем интересную новость. В доме, где приезжий остановился, он сообщил ее только трем местным жителям. Это заняло четверть часа. Итак, через 15 минут новость была известна в городе всего только четверым. Узнав эту новость, каждый из трех местных жителей поспешили рассказать ее трем другим. На это потребовалось четверть часа. Значит, спустя полчаса в городе уже 13 человек знали новость. Каждый из девяти вновь узнавших новостью поделился в ближайшие четверть часа с тремя другими гражданами и т. д.
Когда все жители Компьютеринска будут осведомлены о новости, которая в t часов m минут была известна только одному человеку?

Вот, то, что я сделал. Прога работает, но слишком медленная. Нужно, чтоб за 1 секунду все происходило. У меня 1,09.
var y, v, n, t, min, i:integer;
begin
readln(min, t);
y:=1;
v:=1;
n:=0;
repeat
n:=n+1;
y:=y*3;
v:=v+y;
until v>=50000;
n:=n*15;
t:=t+(n div 60);
min:=(min+ n mod 60) mod 24;
if min>=60 then begin
i:=i+1;
min:= min mod 60;
end;
writeln(t, min)
end.
Замените readln(min, t); на присвоение и будет вам счастье. в задании нет требования читать входные данные с консоли. Кроме того, засечка времени программы с консольным вводом - это большая некорректность. вводите быстро (или с помощью переопределения ввода) и уложитесь в норматив

Цикл здесь лишний, не зависит от входных параметров, n вычисляется аналитически
Серик Абдыкаримов
Серик Абдыкаримов
91 358
Лучший ответ
Школа, математика, сумма геометрической прогрессии b[i] = b[0] * q ** i { ** - в степени }, где b[0] = 1 и q = 3

сумма = b[0] * (q ** (i + 1) - 1) / (q - 1) = 1 * (3 ** (i + 1) - 1) / (3 - 1) = (3 ** (i + 1) - 1) / 2

50001 = (3 ** (i + 1) - 1) / 2 {50001 потому, что один приезжий}
3 ** (i + 1) - 1 = 100002
3 ** (i + 1) = 100003
log(3 ** (i + 1)) = log(100003)
(i + 1) * log(3) = log(100003)
i = log(100003) / log(3) + 1

Таким образом, все жители будут оповещены через (trunc(log(100003) / log(3)) + 1) * 15 = 165 минут.

P.S. Просто trunc потому, что log3(100003) не является целым числом.
Асхат Кармаков
Асхат Кармаков
98 280
Асхат Кармаков Немного напахал в основном ответе:

b[i] = b[1] * q ** (i - 1) { ** - в степени }, где b[1] = 3 и q = 3
сумма = b[1] * (q ** i - 1) / (q - 1) = 1 * (3 ** i - 1) / (3 - 1) = (3 ** i - 1) / 2
50000 = (3 ** i - 1) / 2
i = log(100001) / log(3)

Будут оповещены через (trunc(log(100001) / log(3)) + 1) * 15 = 165 минут.
по-моему, надо как-то так:

VAR
v, { количество жителей в курсе новости }
t, min { время: часы, минуты }
:Integer;

BEGIN

(* ввод данных *)
readln(min, t);

(* расчет *)
v:=1; { сначала новость знает один }
repeat
v := v * 4; { каждую четверть часа количество осведомленных учетверяется }
inc(min, 15);
if min >= 60 then begin min := min - 60; inc(t); if t >= 24 then t := 0 end;
until v>50000;

(* вывод результата *)
writeln(t, min)

END.
Савлет Kg
Савлет Kg
57 015