Матч 360, Сумма выбранных ячеек (SumOfSelectedCells)

Дивизион 2, Уровень 2; Дивизион 1, Уровень 1

 

Имеется прямоугольная таблица, в каждой ячейке которой записано целое число. Джесси выбирает наибольшее количество клеток так, чтобы в каждой строке и каждом столбце было выбрано не более одной клетки. Джесси высказала гипотезу: “независимо от выбора клеток сумма чисел, находящаяся в них, всегда одинакова”. По таблице, заданной в массиве table, выяснить, верна ли гипотеза Джесси, вернув соответственно “CORRECT” или “INCORRECT”.

 

Класс: SumOfSelectedCells

Метод: string hypothesis(vector<string> table)

Ограничения: table содержит от 1 до 20 элементов, элементы table содержат одинаковое количество записей, числа в которых изменяются от 1 до 50, строка table[i] содержит от 1 до 20 чисел.

 

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

 

Выход. Строка “CORRECT” или “INCORRECT” в зависимости от справедливости гипотезы Джесси.

 

Пример входа

table

{"5 6 6"}

{"11 12 13 14",

"21 22 23 24",

"31 32 33 34",

"41 42 43 44"}

{"3 7",

"3 7",

"3 7"}

 

Пример выхода

“INCORRECT”

“CORRECT”

“CORRECT”

 

 

РЕШЕНИЕ

математика

 

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

A1 A1 A1 ... A1 A1

A2 A2 A2 ... A2 A2

.

.

AH AH AH ... AH AH

То есть каждая строка должна содержать одинаковые элементы. Аналогично если высота таблицы больше ширины, то для выполнения гипотезы таблица должна иметь вид:

A1 A2 ... AW

A1 A2 ... AW

A1 A2 ... AW

.

.

A1 A2 ... AW

A1 A2 ... AW

Рассмотрим теперь случай квадратной таблицы. Выберем четыре ячейки Aip, Ajp, Aiq, Ajq, стоящие на пересечении двух строк и двух столбцов. Пусть Aip + Ajq ≠ Ajp + Aiq. Тогда если среди выбранных имеются ячейки Aip и Ajq, то заменив их на Ajp и Aiq, мы изменим общую сумму. Следовательно, все подобные суммы должны быть одинаковыми. То есть для любых i и j должно выполняться равенство: A11 + Aij = Ai1 + A1j, из которого следует, что первая строка и первый столбец однозначно определяют все остальные числа таблицы.

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

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

#include <sstream>

using namespace std;

 

class SumOfSelectedCells

{

public:

  string hypothesis(vector<string> table)

  {

    int i, j, s, n = table.size(), m;

    vector<vector<int> > v(n);

    for(i = 0; i < n; i++)

    {

      stringstream in(table[i]);

      while (in >> s) v[i].push_back(s);

    }

    m = v[0].size();

    if(n == m)

    {

      for(i = 1; i < n; ++i)

      {

        for(j = 1; j < n; ++j)

        {

          if (v[0][0] + v[i][j] != v[i][0] + v[0][j])

          return "INCORRECT";

        }

      }

      return "CORRECT";

    }

    if(n > m)

    {

      for(i = 0; i < m; ++i)

      {

        for(j = 1; j < n; ++j)

        {

          if (v[j][i] != v[0][i])

          return "INCORRECT";

        }

      }

      return "CORRECT";

    }

    else

    {

      for(i = 1; i < m; ++i)

      {

        for(j = 0; j < n; ++j)

        {

          if (v[j][i] != v[j][0])

          return "INCORRECT";

        }

      }

      return "CORRECT";

    }

  }

};