Блог пользователя madb00blik

Автор madb00blik, 14 лет назад, По-русски

Всем привет!
Разбирая задачи прошлых лет со всесибирской олимпиады школьников, наткнулся на несколько задачек, и меня интересуют идеи по их решению. Надеюсь, вас это заинтересует и поможет не только мне. Текст задач приведен ниже:

Задача 1

Выпускник школы получил диплом степени L на олимпиаде, которой присвоили категорию K. N вузов опубликовали условия приема по результатам олимпиад различных категорий. Для каждой категории олимпиады для каждой степени диплома указывается, каким образом он засчитывается: "вне конкурса", на "100 баллов" или "не принимается вузом". Школьник хочет узнать, в каких вузах его диплом будет засчитан по желаемому критерию. Напишите программу, которая выдает список таких вузов.

Входные данные В первой строке входного файла записаны два натуральных числа L, K и строка S, где L — степень диплома, K — категория олимпиады, а S — критерий (1 ≤ L ≤ 3, 1 ≤ K ≤ 5, S может принимать значения VK или STO). Во второй строке указано количество вузов N, количество категорий олимпиад K1 и количество степеней L1 (1 ≤ L1 ≤ 3, 1 ≤ K1 ≤ 5, 1 ≤ N ≤ 100). В следующих N строках дано описание условий приема в каждый вуз. Строка начинается названием вуза (не более 20 символов), далее записываются K1 групп по L1 слов вида VK, STO, NA, записанных через пробел. VK означает "вне конкурса", STO — "100 баллов", NA – "не принимается вузом". Описание категорий и степеней дипломов в категории идет по возрастанию.
Выходные данные В выходной файл необходимо вывести список названий вузов, подходящих критерию школьника, по одному в строке. Названия вузов выдавать в том же порядке, в каком они встречаются во входном файле. Если нужных вузов нет, то вывести одно слово NO.
Пример

input:

3 2 STO

4 2 3

VUZ1 VK VK VK VK STO STO

VUZ2 VK VK VK STO STO STO

VUZ3 VK VK VK VK VK VK

VUZ4 VK VK NA STO NA NA

output:

VUZ1

VUZ2

Я правильно думаю что это решается с помощью структур? Если да, то в каком ключе?

Задача 2

Вася и Миша купили плитку шоколада из N M квадратных долек и теперь играют в следующую игру, делая ходы по очереди. Первым ходит Вася. В свой ход нужно выбрать и съесть любую дольку, а также съесть все дольки, которые находятся выше и левее выбранной. Кто съедает последнюю дольку — проигрывает и идѐт покупать следующую шоколадку. Например, на плитке 3x3 игра может развиваться следующим образом:

Вася проиграл, так как съел последнюю дольку. Но Вася не любит проигрывать и поэтому решил написать программу, которая подскажет ему оптимальный первый ход, то есть такой ход, после которого как бы ни играл Миша, Вася сможет его победить. Помогите ему написать такую программу.

Входные данные В первой строке входного файла записаны два числа N и M — высота и ширина плитки шоколада в дольках (1 ≤ N, M ≤ 100, N*M ≤ 121).
Выходные данные Если у Васи есть оптимальный первый ход, то в выходной файл нужно вывести два числа H и W— размеры (высота и ширина) прямоугольника, съедаемого этим ходом (1 ≤ H ≤ N, 1 ≤ W ≤ M) . Если оптимальных ходов несколько, то надо выбрать среди них один с наибольшим H. Если и таких несколько, то выбрать среди них ход с наибольшим W. Если же оптимального хода нет, то есть Миша сможет обыграть Васю, как бы тот ни ходил, то нужно в выходной файл записать 0 0.
Пример

input:

3 3

output:

2 2


input:

1 1

output:

0 0

Задача 3

Вам дана последовательность целых чисел, в которой некоторые числа заменены на символ '*', а одно число вообще пропущено. Известно, что исходная последовательность чисел представляла собой арифметическую прогрессию. Гарантируется, что не менее трех чисел в последовательности замене не подверглись.
Вам необходимо определить сумму всех чисел исходной последовательности. Если по входным данным невозможно однозначно определить сумму, необходимо вывести все возможные значения суммы в порядке возрастания.

Входные данные Во входном файле задана последовательность, состоящая из символов '*' и целых чисел. Все данные введены в одну строку через пробел. Количество элементов в последовательности больше 2 и не превосходит 10. Целые числа по модулю не превосходят 100.

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

input.txt

2 * 6 10

output.txt

30

На этом все, очень интересно было бы посмотреть чужие соображения по этому поводу :)

  • Проголосовать: нравится
  • +2
  • Проголосовать: не нравится

»
14 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +1 Проголосовать: не нравится

Плюс за вторую задачу, уже давно пытаюсь придумать решение, и всё никак :)

»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

В ограничениях второй задачи, имеется в виду, что произведение N*M <= 121 ? И какое ограничение по времени?

  • »
    »
    14 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

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

    • »
      »
      »
      14 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      Да, была такая идея, но как именно делать прекальк? Все возможные состояния — это вроде бы 2^(nm), наверно, будет долго.

      • »
        »
        »
        »
        14 лет назад, скрыть # ^ |
        Rev. 2  
        Проголосовать: нравится 0 Проголосовать: не нравится

        Ну лесенок таких не 2nm их вообще мало...

      • »
        »
        »
        »
        14 лет назад, скрыть # ^ |
        Rev. 3  
        Проголосовать: нравится 0 Проголосовать: не нравится

        Вообще-то, их O(max(n, m) ^ min(n, m)), что в худшем случае есть 11^11 (на самом деле меньше, т.к. у нас лесенки монотонно убывающие/возрастающие — смотря с какой стороны посмотреть).

        Я попробовал вручную поискать закономерность — удалось найти ее для квадратных полей и полей, у которых меньшая размерность <= 2. Мне кажется, что ретроспективный анализ на небольших тестах (порядка 6хN) найдет закономерность, обобщаемую и на большие размерности.

        UPD. Только что загнал брутфорс, получил, что в худшем случае состояний у нас будет 705432, переходов — не более 121 на состояние (опять-таки, на самом деле их намного меньше). Так что, автор, аккуратно пиши ретроспективный анализ, и да будет тебе счастье :).

»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Во второй задаче почти всегда, кроме случаев n = 1 || m = 1 нужно взять прямоугольник (w — 1, h — 1) или я чего-то не понимаю?

»
14 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Первая — реализация.

В последней я перебирал разность прогрессии, дальше просто подставлял вместо звёздочек.