Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2013, 16:09   #1
APEJl
 
Регистрация: 21.10.2013
Сообщений: 4
По умолчанию Олимпиадная задача "Количество итераций (10-11 классы)"

Здравствуйте, можете пожалуйста объяснить как решается такая задача
"Для определения вычислительной сложности программы в первую очередь нужно рассмотреть имеющиеся в ней циклы и определить количество итераций (повторений) каждого из этих циклов. Если циклы являются вложенными, то для определения вычислительной сложности количество итераций нужно перемножать, если циклы выполняются последовательно, то количество итераций необходимо суммировать.
Напишите программу, которая определяет суммарное количество итераций для некоторой комбинации циклов.
В первой строке ввода содержится одно целое число N (1 ≤ N ≤ 10) — количество циклов в программе. Далее следует 2·N строк, содержащих информацию о циклах в анализируемой программе. Каждая строка содержит либо строку вида "for x", где x – целое число в диапазоне от 2 до 1000, количество итераций, либо строку "end", обозначающую конец цикла. Гарантируется, что каждый for будет иметь соответствующий ему end и наоборот.
Вывести в первой строке одно целое число — суммарное количество итераций для анализируемой программы. Гарантируется, что результат не будет превышать 10^18.

Пример ввода 1
2
for 100
for 20
end
end

Пример вывода 1
2000

Пример ввода 2
2
for 100
end
for 20
end

Пример вывода 2
120"
Имеется правильное решение
Код:
uses sysutils;
var st:array[0..20]of int64;
 t,n,i:integer;
 s:string;
begin
 t:=0;
 readln(n);
 for i:=1 to 2*n do
 begin
 readln(s);
 if copy(s,1,3)='for' then
 begin
 inc(t);
 st[t]:=StrToInt(Copy(s,5,Length(s)-4)); 
 { для накопления произведения }
 inc(t);
 st[t]:=0; { для накопления суммы }
 end
 else {end}
 begin
 if st[t]=0 then
 st[t]:=1;
 st[t-1]:=st[t-1]*st[t]; 
 dec(t);
 st[t-1]:=st[t-1]+st[t];
 dec(t);
 end;
 end;
 writeln(st[0]);
end.
В самом коде я понимаю, что какая строка значит, что как делается, но сам бы я не додумался до такого решения, и вообще не понимаю как можно было прийти к такому решению, но оно правильное. можете пожалуйста объяснить как решаются подобные задачи, можно на примере этой. заранее огромное спасибо.
APEJl вне форума Ответить с цитированием
Старый 28.11.2013, 17:30   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

http://www.twirpx.com/files/informat...ages/olympics/
ZX Spectrum-128 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запутался в задачах - олимпиадная задача "Сканворд" rus084 Паскаль, Turbo Pascal, PascalABC.NET 5 18.11.2013 07:45
Олимпиадная задача "Золото племени АББА" на Pascal (№7 с acmp.ru) Ghost3 Помощь студентам 19 17.01.2013 21:04
Олимпиадная задача "Карточки" (Pascal) rustkill Помощь студентам 1 01.05.2012 17:40
Олимпиадная задача "Встреча" (на поиск оптимального маршрута, графы) woofer46 Фриланс 2 15.01.2012 15:26