Задача на логику. (Матрицы)

математика логика задача Комбинаторика

Дана прямоугольная матрица вещественных чисел, условимся, что элементы неотрицательные (хотя это необязательно для решения задачи). Суммы элементов каждой строки и столбца - целые числа. Нужно округлить каждый элемент матрицы до целого числа сверху или снизу так, чтобы суммы строк и столбцов не изменялись. Опишите алгоритм решения и докажите его существование.
Ответы:
Для простоты можно забыть про матрицу: рассмотрим просто набор вещественных чисел, сумма которых равна целому.
Пусть сумма этих чисел равна N (N - целое), а их количество n.
Алгоритм следующий: Запишем сначала новую последовательность, состоящую из целых частей всех чисел последовательности.  Суммируем эти целые части  чисел и получаем некоторое число M<N. Пусть M-N=b. Теперь добавляем по 1 на случайные b элементов этой новой последовательности и получаем новую последовательность уже целых чисел, сумма которых равна целому числу N.
Например, есть последовательность (1,4) (1,6) (1,7) (1,3) (2). Сумма равна 8.
Новая последовательность (1) (1) (1) (1) (2). Сумма равна 6. 8-6=2. Добавляем двум элементам по 1. и получаем новую последовательность (2) (2) (1) (1) (2), сумма которой равна 8.
Даже если мы добавили единицу элементу (2), то тоже ничего страшного - у нас же нет ограничения на округления. Если же есть ограничения на округления (т.е. мы не можем округлить элемент (2) до (3)), то нужно подумать, но думаю алгоритм все равно есть.
Например можно добавить правило, что добавляем по единице к тем элементам, разность между целыми их частями и первоначальными вещественными максимально. Т.е. в нашем случае выбираем максимальную по модулю разницу (это 1-1,7 и 1-1,6) и добавляем по единице этим числам.
Теперь точно алгоритм готов!


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

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

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.