Рамка из a, b, c, d реек с максимальным периметром


Одна из тестовых задачек (меня заинтересовала).
  1. Условия задачи о максимальном периметре рамки из реек
  2. Два способа решения (взаимоисключающих)
  3. Максимальный Периметр прямоугольной рамки
  4. Логика на условных операторах. Помощь в решении

Все в мире логично! Всему есть первопричина...


Условия задачи о максимальном периметре рамки из реек

Условие :
У Феди есть четыре рейки, из которых он хочет сделать прямоугольную рамку. При этом не обязательно, чтобы все рейки были использованы полностью или частично. Федя может разрезать любую рейку на 2 или более частей, но не умеет соединять рейки или их части для использования полученной склейки в качестве какой-либо стороны рамки. Федя хочет, чтобы рамка имела наибольший периметр.
Напишите программу, определяющую максимальный периметр прямоугольной рамки, которую можно сделать из четырех реек заданных размеров.
Первая строка ввода содержит четыре целых числа a, b, c, d в неубывающем порядке (1 ≤ a ≤ b ≤ c ≤ d ≤ 1000) — размеры реек.
В первой строке необходимо вывести одно целое число — максимальный периметр рамки.

Условия задачи о максимальном периметре рамки из реек   по заданию и параметрам
Рис.1        Условия задачи о максимальном периметре рамки из реек   по заданию и параметрам

Другими словами - резать заданные рейки на части можно, а соединять, сращивать нельзя.
Сумейте получить две пары сторон рамки, обеспечив при этом наибольший периметр.





Два способа решения (взаимоисключающих)

Во-первых, ПЕРЕБОРОМ.

private void fix(int tL, int tW)
{
    int tP = 2 * (tL + tW);
    if (P < tP)
    { P = tP; L = tL; W = tW; } //фиксирую лучший результат
}

Посылая во вспомогательную функцию fix в виде параметров временные значения сторон рамки, в глобальных переменных L,W и P будут фиксироваться только лучший результат.

И, тогда множеством таких вставок… пытаться описать весь процесс
if (d > 1 && c > 1)
{
    tL = d/2; tW = c/2; // P = d+c
    fix(tL, tW); //фиксация максимума
}

if (d >= c+b)
{
    tL = c; tW = b; // P от 2*(b+c) до 2*d
    fix(tL, tW); //фиксация максимума
}

Благодаря быстроте компьютера все эти действия со вставками происходят как бы мгновенно.

Во-вторых, ЛОГИЧЕСКИ, то есть, построением архитектуры из условных операторов.

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





Максимальный Периметр прямоугольной рамки

В помощь тем, кто самостоятельно пытается найти решение...

Максимальный Периметр прямоугольной рамки   Калькулятор с двумя способами решения
Рис.2        Максимальный Периметр прямоугольной рамки   Калькулятор с двумя способами решения

скачать exe-файл для тестирования





Логика на условных операторах. Помощь в решении

Вспомогательная функция для получения наибольшего значения одной из сторон по данным двух реек:

// возвращает величину от pmax/2 до pmax
// т.е. исключает pmin, если ею можно пренебречь
static int best(int pmin, int pmax)
{
    int res = Math.Min(pmax, Math.Max(pmin, pmax / 2));
    return res;
}

А дальнейшая помощь... в личку.



Другие примеры на тему «Упаковка, укладка продукции и раскрой материала»



Если у Вас остались вопросы, то задать их Вы можете, нажав на эту кнопочку ...


Поделиться в соц сетях:



Комментарии :




  Добавить комментарий :      обязательные поля помечены *       (по желанию)   

Сообщение  *  (в тексте допустимы e-mail адрес и/или ссылка на Ваш сайт)

Напишите контрольный код     в это окно * 

                


Если на этой странице не нашлось того, что Вы так искали...

         Не расстраивайтесь, не все потеряно... Смело щелкайте...
исходный код на заказ. orenstudent.ru Автоматизация документов MS Office. исходный код на заказ. orenstudent.ru Помогите найти и устранить ошибку в исходном коде программы. orenstudent.ru Skype-консультирование по программированию
Скайп-консультации
Сайт помощи студентам по программированию и информатике

Program code