Как выразился один из конкурсантов, "элементарщина с уроков информатики". Нужно просто помнить алгоритмы - или, на крайний случай, вывести их. Также не следует забывать, что числа могут быть отрицательными. Замечу, что для перевода в десятичную систему достаточно одного цикла по строке, без использования strlen и pow.
Многие подумали, что в задаче действительно требуется пересчитать все клетки. На самом деле все куда проще. Перебрав несколько вариантов шахматных досок, можно заметить, что белых и черных поровну, если хотя бы одна сторона четная. В противном случае будет перевес на одну клетку - как раз на ту, которая стоит в углу.
Первая функция подсчитывает кол-во элементов, больших нуля, затем больших единицы и так далее, пока таковые имеются, записывая результат в массив. Вторая вызывает первую два раза. Увы, никто не разглядел в этом ужасе банальную сортировку. А ведь только и надо было, что не полениться и запустить уберфункцию несколько раз с разными входными данными.
Данная задача решается одним вложенным циклом. Если текущая клетка занята, а сверху и слева пусто - значит, мы нашли новый корабль. Такой алгоритм прекрасно работает, если не забыть рассмотреть частные случаи - нулевая строка и нулевой столбец.
Комментарии к решениям
(10 + 3) + 10 + (6 + 0) + 20 = 49
1. Начнем с того, что у тебя Compilation error - строка 32, попытка вернуть string вместо integer. Но даже если исправить ее, DecToN все равно не будет работать - переменная targetNum не инициализирована, при первом же обращении к ней будет crash потока. Плюс хотелось бы отметить неоптимальный аналог функции Pow и отсутствие поддержки отрицательных чисел.
2. Крайне неразумно считать тайлы вложенным циклом. К тому же, ты забыл присвоить нули счетчикам, из-за чего опять же крашится поток.
3. Вспомогательная функция описана правильно, про главную сказано только, что она дважды вызывает вспомогательную. Оптимайз-варианта нет. P. S. Функция не фаталит. Проверено.
4. Вариант с буферизацией, вполне приемлемый. Баллы же ты потерял потому, что в первом if'е забыл установить colCont в true.
Как ты думаешь, я просто так советовал проверять решения перед посылкой?
(15 + 10) + 25 + (7 + 3) + 25 = 85
1. Единственный участник, чьи функции переводят отрицательные числа.
2. Все верно, сравнение остатков.
3. Оказался ближе всех к правильному ответу, подметив, что массив после выполнения заполнен числами в порядке невозрастания. Предложенная оптимизация действительно снижает затраты, но ненамного.
4. Вообще предполагалось, что будет использован вложенный цикл, но и такое решение вполне подходит.
(13 + 6) + 15 + 0 + 0 = 34
1. Нет обработки отрицательных чисел. И не стоит в цикле каждый раз вычислять степень.
2. Простой перебор всех клеток с подсчетом количества.
(13 + 5) + 0 + 0 + 0 = 18
1. Compilation error на строке 45 - попытка передать string в I2S. Но за это баллы не снимаются, т. к. это процедура тестирования. Не работают отрицательные числа, и ты перемудрил с переводом букв.
0 + 25 + 0 + 20 = 45
2. Как ни странно, задание выполнено абсолютно верно.
4. Алгоритм выбран не самый лучший, но с натяжкой можно засчитать.
Для решения задачи в простейшем виде нужно было просто пройтись по строке, выполняя действия. Замечу, что для идентификации команды достаточно знать лишь первую букву. При наличии таких конструкций, как циклы, несколько нелогично сканировать уже пройденные места снова и снова. Для решения этой проблемы можно либо заранее разбить строку на массив, либо (что дает намного больший выигрыш) транслировать ее в некое подобие байт-кода. При появлении блоков возникает проблема циклов "топтания на месте". Цикл с большим (возможно, бесконечным) числом итераций может вести себя двумя способами. Первый - изменять позицию робота, второй - не изменять. Так как мы имеем поле ограниченных размеров, очевидно, что в первом случае робот рано или поздно убьется об стену. Во втором случае робот никуда не движется, следовательно, выполнять такой цикл не имеет смысла. Нужно каждый раз в цикле сравнивать текущую позицию робота с предыдущей, и если они совпадают, то прекращать цикл. Я сомневаюсь, что кто-то за столь короткий срок мог додуматься до такого оптимизаторского бреда, поэтому баллы за это не снимались. P. S. Похоже, никто так и не понял, что Labyrinth(x, y) возвращает битовую маску. Нулевой бит - есть стена сверху, первый - слева, второй - снизу, третий - справа.
Комментарии к решениям
10 + 5 + 5 + 5 + 0 + 0 = 25
Алгоритм как бы есть, но из-за большого количества опечаток его как бы нет. Мне все же удалось заставить программу работать на простейших тестах. Если исправить еще несколько ошибок, заработает и на остальных.
20 + 10 + 10 + 10 + (10 + 10 + 10) + 0 = 80
Сделано все, кроме вложенности, и все это работает. Особо жутких косяков в коде не заметил, так что все по максимуму.
К разочарованию некоторых участников, в этой задаче теория графов не требуется. На рисунке показан самый простой (и самый эффективный) способ разделения территории:
Думаю, теперь вы догадались, как надо было сделать. Если нет - ответы есть в прикреплении.
Среди всех заклинаний нужно было выбрать восемь: два наибольших положительных, два наименьших положительных, два наименьших отрицательных и два наибольших отрицательных. Максимальную силу дает произведение двух наибольших положительных либо двух наименьших отрицательных. Также следует учесть вариант, когда в строке только два заклинания, причем разных знаков. Минимальную силу дает произведение наибольшего положительного и наименьшего отрицательного. Если сила всех заклинаний одинакова по знаку, следует выбрать два из них с наименьшей по модулю силой.
Комментарии к решениям
0 + 40 = 40
Записываешь все заклинания в массив, после чего сортируешь его. Не будет работать на списках, состоящих из множества коротких слов. И все-таки один случай ты пропустил - когда сила всех заклинаний отрицательна, твоя программа работает неверно.