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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2008, 14:28   #1
Dansergyr
 
Регистрация: 17.11.2008
Сообщений: 3
Восклицание олимпиадная задачка...

Дана последовательность из N круглых,квадратных и фигурных скобок.Выяснить,можно ли добавить в неё цифры и знаки арифметических действий так,чтобы получилось правильное арифметическое выражение. Ограничения:1<=N<=100000.
Ввод из файла bracket.in.В первой строке находится число скобок N,во второй N символов из набора (,),[,],{,}. Вывод в файл bracket.out.
Выводится слово "Yes",если получить правильное арифметическое выражение можно,или "No" если нельзя.

PS: помогите осуществить ПОЖАЛУЙСТА!!! не для участия в олимпиаде...
язык Паскаль,вижуал бейсик,делфи,или си.
Dansergyr вне форума Ответить с цитированием
Старый 17.11.2008, 17:56   #2
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

Задача довольно старая, была у меня на олимпиаде лет 15 назад.
Первая проверка: Если N нечетно - нет.
Далее: Ищем в последовательности одну из пар: () или {} или []. Если нашли - вырезаем и ищем заново. И так до того пока длина последовательности не станет равной нулю (верно) или пока не дойдем до конца и ничего не найдем (неверно).
Aristarh Dark вне форума Ответить с цитированием
Старый 18.11.2008, 00:37   #3
Dansergyr
 
Регистрация: 17.11.2008
Сообщений: 3
По умолчанию

блин до чего же все просто... я блин даже просто не вдумался...
мне девчонка знакамая попросила найти чела кот сможет решить... оказывается теперь сам смогу решить спасибо большое!
ps: а я то думал в ней про интервалы и отрезки...ухахаха

хотя, стой а что там за числа и знаки арифметических операций? вот они то меня и сбили с толку...

Последний раз редактировалось Stilet; 30.11.2009 в 10:45.
Dansergyr вне форума Ответить с цитированием
Старый 18.11.2008, 09:09   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ищем в последовательности одну из пар: () или {} или []. Если нашли - вырезаем и ищем заново. И так до того пока длина последовательности не станет равной нулю
Вынужден немного Вас огорчить... Это не совсем так ;-(
вот, что будет, если обработать такую очевидно неправильную последовательность:
([)]

Dansergyr, про правильность скобок читайте здесь - Проверить равенство числа открывающих и закрывающих круглых скобок
и, можно ещё здесь - Задача на анализ текстового файла

Только у Вас другая задача - надо не только проверить на согласованность скобок, но и добавить заданные так, чтобы выражение было правильным... это, ИМХО, гораздо сложнее.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.11.2008, 21:26   #5
Dansergyr
 
Регистрация: 17.11.2008
Сообщений: 3
По умолчанию

да я понимаю что это сложнее да и вообще не понимаю каким образом туда можно записать числа и знаки арифметических операций
напишите несколько примеров конечных выражений,уже со скобками, числами и арифм операциями...хотя бы 1 верное и 1 неверное....
Dansergyr вне форума Ответить с цитированием
Старый 19.11.2008, 05:57   #6
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вынужден немного Вас огорчить... Это не совсем так ;-(
вот, что будет, если обработать такую очевидно неправильную последовательность:
([)]
Ничего не будет, последовательность не верная, т.к. ни одна из пар (),[],{} в ней не встречается.
Aristarh Dark вне форума Ответить с цитированием
Старый 19.11.2008, 07:52   #7
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

Код:
var s:string;
    c:byte;
    b:boolean;
begin
     readln(s);
     b:=true;
     while b do
      begin
       b:=false;
       c:=pos('[]',s);
       if c>0 then
        begin
         delete(s,c,2);
         b:=true;
        end;
       c:=pos('()',s);
       if c>0 then
        begin
         delete(s,c,2);
         b:=true;
        end;
       c:=pos('{}',s);
       if c>0 then
        begin
         delete(s,c,2);
         b:=true;
        end;
      end;
    if length(s)>0 then writeln('No')
    else writeln('Yes');
end.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 19.11.2008, 09:19   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Ничего не будет, последовательность не верная, т.к. ни одна из пар (),[],{} в ней не встречается
угу. понял. Признаю свою неправоту. Если в строке (как в данной задаче) есть ТОЛЬКО открывающие закрывающие скобки - тогда Ваш алгоритм безусловно сработает.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.11.2008, 09:50   #9
Aristarh Dark
Форумчанин
 
Регистрация: 07.08.2007
Сообщений: 154
По умолчанию

Цитата:
Если в строке (как в данной задаче) есть ТОЛЬКО открывающие закрывающие скобки - тогда Ваш алгоритм безусловно сработает.
Если есть другие - то строку можно и подчистить предварительно.
Aristarh Dark вне форума Ответить с цитированием
Старый 19.12.2008, 02:12   #10
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

а наиболее рациональный способ кстати это вроде стек......

ой...... да тут уж месяц прошел)))))
Надо бы избавиться от привычки ставить многоточие.....

Последний раз редактировалось Min; 19.12.2008 в 02:13. Причина: ээээ...
Min вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачка Cvieri Microsoft Office Excel 9 08.10.2008 19:44
Задачка Rusl92 Паскаль, Turbo Pascal, PascalABC.NET 7 25.09.2008 16:01
C++ олимпиадная задачка LastDragon Помощь студентам 1 19.06.2008 23:04
Олимпиадная задача Carbon Общие вопросы C/C++ 2 23.05.2007 22:07