Три сына
Ограничение времени 1 секунда
Ограничение памяти 64Mb
Ввод стандартный ввод или division.in
Вывод стандартный вывод или division.out
Во владениях короля Флатландии находится прямая дорога длиной n километров, по одну сторону от которой расположен огромный лесной массив. Король Флатландии проникся идеями защиты природы и решил превратить свой лесной массив в заповедник. Но сыновья стали сопротивляться: ведь им хотелось получить эти земли в наследство.
У короля три сына: младший, средний и старший. Король решил, что в заповедник не войдут участки лесного массива, которые он оставит сыновьям в наследство. При составлении завещания король хочет, чтобы для участков выполнялись следующие условия:
каждый участок должен иметь форму квадрата, длина стороны которого выражается целым положительным числом. Одна из сторон каждого квадрата должна лежать на дороге. Пусть участки имеют размеры a × a, b × b и c × c;
стороны квадратов должны полностью покрывать дорогу, т.е. a + b + c = n;
участок младшего сына должен быть строго меньше участка среднего сына, а участок среднего сына должен, в свою очередь, быть строго меньше участка старшего сына, то есть должно выполняться неравенство a < b < c;
суммарная площадь участков a2 + b2 + c2 должна быть минимальна.
Требуется написать программу, которая по заданной длине дороги определяет размеры участков, которые следует выделить сыновьям короля.
Формат ввода
Входной файл содержит одно целое число n (6 ≤ n ≤ 109).
Формат вывода
Выходной файл должен содержать три целых положительных числа, разделенных пробелами: a, b и c – длины сторон участков, которые следует выделить младшему, среднему и старшему сыну, соответственно. Если оптимальных решений несколько, разрешается вывести любое.
Пример
Ввод Вывод
6 1 2 3
написать надо на C++
Помогите пожалуйста
Ответы
Ответ:
Вот простое решение на C++, которое решает данную задачу.
#include <iostream>
int main() {
int n;
std::cin >> n;
int quotient = n / 3;
int remainder = n % 3;
if (remainder == 0) {
std::cout << quotient << " " << quotient << " " << quotient;
} else if (remainder == 1) {
std::cout << quotient << " " << quotient << " " << quotient + 1;
} else {
std::cout << quotient << " " << quotient + 1 << " " << quotient + 1;
}
return 0;
}
Этот код сначала проверяет, делится ли длина дороги на три без остатка. Если это так, то каждому сыну достанется участок одинакового размера. Если остается остаток 1, то старшему сыну достанется участок большего размера. Если остается остаток 2, то среднему и старшему сыну достанутся участки большего размера.
Объяснение: