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

Автор student, история, 3 года назад, По-русски

Кроссворд для дроида

  • Ограничение времени: 2 секунды
  • Ограничение памяти: 512Mb
  • Ввод: стандартный ввод или input.txt
  • Вывод: стандартный вывод или output.txt

R2-D2 решает кроссворд, составленный специально для дроидов. В этом кроссворде в клеточки нужно писать не буквы, а цифры.

Кроссворд представляет из себя клетчатое поле $$$n \times m$$$. Некоторые клетки заблокированы, а все остальные — свободные. Словом в кроссворде назовем максимальный по включению вертикальный или горизонтальный отрезок свободных клеток. Иными словами, слово — это отрезок клеток одного столбца или строки, ограниченный с обоих сторон краем поля или заблокированными клетками.

Исходно, каждая свободная клетка кроссворда содержит какую-то цифру. Цель дроида — поменять цифры таким образом, чтобы каждое слово в кроссворде являлось палиндромом. Палиндром — это строка, читающаяся одинаково как слева-направо так и справа-налево. При этом, чем меньше суммарное изменение цифр в кроссворде по сравнению с исходными, тем лучше. Поэтому, требуется найти такое решение кроссворда, при котором сумма по всем свободным клеткам модулей разности исходной цифры и цифры в решении, была минимальна.

Помогите R2-D2 решить кроссворд так, чтобы суммарное изменение цифр было минимально. Несложно заметить, что всегда есть способ заполнить кроссворд так, чтобы все слова были палиндромами. Например, заполнить все свободные клетки одинаковыми цифрами. Поэтому, решение всегда существует.

Формат ввода

В первой строке дано два целых числа $$$n$$$ и $$$m$$$ — размеры поля ($$$1 \leq n$$$, $$$m \leq 1 000$$$).

В следующих $$$n$$$ строках дано по $$$m$$$ символов — описание кроссворда. Символы могут быть равны $$$«.»$$$ или цифрам. Символ $$$«.»$$$ соответствует заблокированной клетке. А символ с цифрой $$$d$$$ соответствует свободной клетке, в которой исходно написана цифра $$$d$$$.

Формат вывода

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

Полный текст и комментарии »

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

Автор student, история, 3 года назад, По-английски

I need the solution of this problem: J. Straight

Can anyone help me?

#include <bits/stdc++.h>

using namespace std;

#define x 1e5

int n, m, s;
vector<int> cards;

int tmp[int(x)];


inline void solve()
{
    cin >> n >> m >> s;
    for (int i = 0; i < m; i++) cin >> tmp[i];

    sort(tmp, tmp + m);

    cards.push_back(tmp[0]);
    for (int i = 0; i < m; i++) if (cards.back() != tmp[i]) cards.push_back(tmp[i]);

//    for (int card : cards) cerr << card << ' '; cerr << endl;


    int prev = 0, delta = m - s - 1;
    int result = 0;
    for (int i = 0; i < int(cards.size()) - delta; i++) {
//        cerr << i << ' ' << i + delta << endl;
        int diff = cards[i + delta] - cards[i];
//        cerr << diff << endl;
        if (diff < m) {
            int d = cards[i + delta] - m + 1;
            if (d <= prev) d = prev + 1;

            result += cards[i] - d + 1;
            prev = cards[i];

//            cerr << result << endl;
        }
    }
    cout << result << endl;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    solve();

    return 0;
}

Полный текст и комментарии »

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

Автор student, история, 3 года назад, По-русски
  • Проголосовать: нравится
  • -3
  • Проголосовать: не нравится