Задача 1 «Новогодний балл»




Ввод 1 Вывод 1 Ввод 2 Вывод 2

6 No 24

([ ()) ] { [ () ([ ] { }) [ ] ] ({ } { { } }) }[] Yes

 

Эта задача – первая в серии задач, где рассматриваются скобочные выражения. Она знакомит с понятием правильного скобочного выражения. Скобочное выражение является правильным, если у каждой открывающей скобки есть своя закрывающая скобка соответствующего типа, а внутри этой пары скобок находится правильное скобочное выражение.

Рассмотрим использование стека для проверки такого скобочного выражения
[ ([ ] { }) [ ] ] (). В стеке будем хранить открытые и до сих пор не закрытые скобки в порядке их открытия.

 

В схеме над стрелками, показано какая скобка обрабатывается в данный момент. Вертикальные столбики скобок показывают состояние стека, самая нижняя скобка та, которая попала в стек первой, она будет извлечена последней, а самая верхняя та, которая попала последней к текущему моменту и будет извлечена первой.

Скобочное выражение является неправильным в трёх случаях:

1. Очередной является закрывающая скобка, а стек пуст (не осталось открывающих).

2. Тип очередной закрывающей не совпадает с типом последней открытой скобки.

3. После обработки всего выражения в стеке остались открывающие скобки.

Детали реализации:

1. Реализуем стек в виде символьного массива и одного целого числа, которое обозначает размер стека в данный момент.

2. 100 000 элементов – это много, но нам столько и ненужно. Достаточно массива на 50 000. А если в какой-то момент открывающих скобок стало 50 001, то можно выводить ответ No.

Program skobki;

Var stek: array [1..50001] of char;

n, i, vs: longint;

sk: char;

Begin

assign(input,' bracket.in ');

assign(output,' bracket.out ');

reset(input);

rewrite(output);

readln(n);

 

if n mod 2<>0 then

Begin

write('No'); close(output); halt;

end;

 

vs:=0;

for i:=1 to n do

Begin

read(sk);

 

if (sk='(') or (sk='[') or (sk='{') then

begin vs:=vs+1; stek[vs]:=sk; continue; end;

 

if (vs=50001) then

begin write('No'); close(output); halt; end;

 

if ( (sk=')') or (sk=']') or (sk='}') ) and (vs=0) then

begin write('No'); close(output); halt; end;

 

if ((sk=')') and (stek[vs]='(')) or

((sk=']') and (stek[vs]='[')) or

((sk='}') and (stek[vs]='{'))

then vs:=vs-1

else begin write('No'); close(output); halt; end;

end;

 

if vs=0 then write('Yes')

else write('No');

close(input);

close(output);

End.

Задача 1 «Новогодний балл»

Ввод данных — из файла input.txt Ограничение по памяти — 64 мегабайта

Вывод данных — в файл output.txt Ограничение времени — 1 секунда на тест

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

Пусть «<» обозначает парня, а «>» - девушку. Тогда правильной расстановкой танцующих назовем такую расстановку, в которой для каждой девушки можно найти «незанятого» пария, находящегося только справа от нее и нет такой девушки, для которой не было бы найдено пары.

Например, расстановка «>>>><<><<><><><<» будет правильной, что иллюстрирует следующий рисунок:

Из рисунка видно, что девушка «занимает» того парня, который находится ближе к ней и не является «занятым» кем-то ранее. При этом девушки «занимают» тех парной, которые находятся наиболее близко к ним, если идти слева направо, т.е. девушка номер 4 на рисунке займет парня номер 5 раньше, чем девушка номер 3.

Расстановка «>><<<>><» является неправильной, т.к. девушка, которая располагается на позиции 6, не может найти себе «незанятого» парня, поскольку он располагается слева от нее.

Расстановка «>><<>» будет неправильной, т.к. девушка на позиции 5 не найдет себе парня, т.к. парней недостаточно, чтобы все пары были сформированы.

Помогите Пете определить, является ли заданная расстановка правильной.

Входные данные. На вход программе подается единственная строке -расстановка танцующих, правильность которой необходимо проверить.

Выходные данные. В результате работы программа должна вывести на экран сообщение. Если расстановка правильная, то необходимо вывести «legal», если же нет, то «illegal» (без кавычек).

Ограничения. Расстановка состоит только из символов «<» или «>». Длина расстановки не превышает 10000 символов.

Замечание. Если программа на всех тестах выдает одинаковое сообщение (всегда «legal» или всегда «illegal»), то она получает 0 баллов.

Примеры:

Вход Выход
>><<>< legal
><<> illegal
<<>> illegal
>>><<< legal
><> illegal

 

Задача 2 «Конфеты»

Ввод данных — из файла input.txt Ограничение по памяти — 64 мегабайта

Вывод данных — в файл output.txt Ограничение времени — 1 секунда на тест

Однажды Петя, решая задачки, проголодался и решил пойти попить чай с конфетами. У него дома было много разных сортов конфет. Он выложил их всех в ряд и решил их есть не по порядку, а особым образом.

Сначала он находит в ряду две рядом лежащие конфеты одного сорта, съедает их, потом сдвигает все конфеты и опять ищет две рядом лежащие одного сорта, съедает их, и т.д.

У Пети много конфет, он хочет узнать сможет ли он съесть их все, таким способом.

Ввод

Сначала вводится целое число N (1 ≤ N ≤ 10000) – количество конфет.

Далее вводятся N целых чисел, каждое означает сорт конфеты. Числа больше 0 и не превышают 1000

Вывод

“Yes”, если Петя сможет съесть все конфеты или “No” в противном случае.

Пример

Ввод Вывод
1 1 YES
1 1 1 NO
2 3 3 2 YES

Примечание:

2 3 3 2 -> 2 2 -> нет конфет

Сначала Петя съест две конфеты 3 сорта. Потом две конфеты 2 сорта. Значит, он может съесть все - выведем YES.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-30 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: