В небольшой город Компьютеринск с 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 вычисляется аналитически
Цикл здесь лишний, не зависит от входных параметров, n вычисляется аналитически
Школа, математика, сумма геометрической прогрессии 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) не является целым числом.
сумма = 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) не является целым числом.
по-моему, надо как-то так:
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.
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.
Похожие вопросы
- Помогите решить задачи по Паскалю
- помогите решить задачу на паскале: напечатать "столбиком" значения sin2, sin3, ..sin 20.
- Помогите решить задачу в паскале
- Помогите решить задачу на паскале
- Помогите решить задачу в паскале. Задание: Заменить в строке все вхождения "да" на "нет".
- Уважаемые!Помогите решить задачу по Паскалю,пожайлуста!
- Помогите решить задачу в паскале
- Помогите решить задачу (в паскале)!
- Помогите решить задачу в паскале, пожалуйста! !
- помогите решить задачу на паскале
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 минут.