Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2023, 22:57   #1
Faserty
Пользователь
 
Регистрация: 22.09.2023
Сообщений: 25
По умолчанию Максимальный периметр Си

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

Пример ввода
5 7 12 15

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

подскажите где ошибка.
Нельзя использовать циклы
Код:
#include <stdio.h>

int main()
{int a,b,c,d,k;
scanf("%d%d%d%d",&a,&b,&c,&d);
if (d == 0){
    k = 0;
    printf("%d",k);
}
else if(c == 0){
    k = d;
    printf("%d",k);
}
else if(b == 0){
    k = c + d;
    printf("%d",k);
}
else if(a == 0){
    k =  b*2 + d;
    printf("%d",k);
}
else{
    k = a*2 + c *2;
    printf("%d",k);
}
}
Faserty вне форума Ответить с цитированием
Старый 11.10.2023, 23:18   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

5 7 12 26 ваш код дает 34, а ответ 40
5 5 5 60 ваш код дает 20, а ответ 70

Последний раз редактировалось p51x; 12.10.2023 в 07:32.
p51x вне форума Ответить с цитированием
Старый 11.10.2023, 23:34   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

p51x, вроде верные ответы 40 (7+7+13+13) и 70 (30+30+5+5).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 11.10.2023, 23:35   #4
Faserty
Пользователь
 
Регистрация: 22.09.2023
Сообщений: 25
По умолчанию

Как это сделать?

Последний раз редактировалось Faserty; 12.10.2023 в 00:45.
Faserty вне форума Ответить с цитированием
Старый 12.10.2023, 02:23   #5
Faserty
Пользователь
 
Регистрация: 22.09.2023
Сообщений: 25
По умолчанию

BDA, сделал такой код
Код:
#include <stdio.h>

int main()
{int a,b,c,d,k;
scanf("%d%d%d%d",&a,&b,&c,&d);

if (b*2 + d > a*2 + c * 2){
    k = b*2 + d;
    printf("%d",k);
}
else if(c + d > b*2 + d && c + d > a*2 + c * 2){
    k = c + d;
    printf("%d",k);
}
else{
    k = a*2 + c * 2;
    printf("%d", k);
}
}
но он тоже не проходит
Faserty вне форума Ответить с цитированием
Старый 12.10.2023, 05:45   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Лень было думать, поэтому смухлевал и перебором выбрал лучшие комбинации распределения сторон рамки среди реек и рассчитал соответствующие им периметры:
Код:
int max_p = -1, p;

// 2 * x <= c && 2 * y <= d
p = (c & ~1) + (d & ~1);
if (p > max_p) max_p = p;

// x <= a && x <= b && 2 * y <= d
p = 2 * a + (d & ~1);
if (p > max_p) max_p = p;

// x <= b && x <= c && 2 * y <= d
p = 2 * b + (d & ~1);
if (p > max_p) max_p = p;

// x <= b && y <= c && x + y <= d
if (b + c < d)
    p = 2 * (b + c);
else
    p = 2 * d;
if (p > max_p) max_p = p;

// 2 * x <= b && y <= c && y <= d
p = (b & ~1) + 2 * c;
if (p > max_p) max_p = p;

// x <= c && x + 2 * y <= d
p = (c + d) & ~1;
if (p > max_p) max_p = p;

// x <= a && x <= b && y <= c && y <= d
p = 2 * (a + c);
if (p > max_p) max_p = p;

printf("%d", max_p);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 12.10.2023, 07:33   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

BDA, пасиб, что-то у меня смешалось решение ТС и моя идея)
p51x вне форума Ответить с цитированием
Старый 12.10.2023, 17:15   #8
dabur
Новичок
Джуниор
 
Регистрация: 12.10.2023
Сообщений: 2
По умолчанию

Уважаемый, BDA. Не могли бы Вы пояснить, что такое x и y в Вашем коде. Вернее, в комментариях к коду. И что значат такого типа выражения, например: (d & ~1)?
dabur вне форума Ответить с цитированием
Старый 12.10.2023, 18:05   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

dabur, за x и y обозначены стороны готовой прямоугольной рамки. Неравенства в комментариях определяют из какой именно рейки будет вырезана сторона. Нужно выбрать максимальные целые x и y, которые удовлетворяют неравенствам, и посчитать периметр P = 2 * x + 2 * y. Например, для неравенства 2 * y <= d максимальный y равен d / 2, тогда 2 * y равен d / 2 * 2. Чтобы не делать деления и умножения, нужно просто взять наибольшее четное число, меньшее числа d, что можно сделать, занулив младший бит числа d с помощью маски ~1.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 12.10.2023, 18:37   #10
dabur
Новичок
Джуниор
 
Регистрация: 12.10.2023
Сообщений: 2
По умолчанию

BDA, премного благодарен за подробные объяснения. Буду разбираться, спасибо.
dabur вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти максимальный элемент на главной диагонали, затем максимальный на побочной диагонали и сравнить их. как написать на C++? Loshara9 Помощь студентам 1 25.04.2018 16:02
Периметр треугольника ershowwk Помощь студентам 1 21.02.2015 18:46
Вычислить периметр Лика505 Помощь студентам 6 05.04.2012 20:19
Периметр n-угольника Raphael Помощь студентам 4 17.10.2010 16:21
периметр shelest Помощь студентам 1 28.11.2009 23:47