Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

Фигури

Фигури

Мнениеот emsihammer98 » 17 Авг 2016, 20:01

Здравейте, хора!
Имам въпрос, свързан с една хем математическа, хем програмистска задача.(Не знам до каква степен може да я наречем забавна :D , по-скоро по-нестандартна)
Ето и условието:
Дадени са две фигури – триъгълник със страни a,b и c и правоъгълник с дължина d и широчина h. Двете фигури трябва да се поставят една до друга така, че да не се припокриват и получената фигура да има най-малка обиколка.
Въпросът ми е:
По какъв начин да намеря минималната възможна обиколка на фигурата, образувана по посочения начин от правоъгълника и триъгълника?

По принцип трябва да се състави алгоритъм, но на мен ми стига да разбера начина, по който да намеря обиколката.

Давам и част от тестовете, които са дадени, както и мои разсъждения, които може би са грешни...
1) При даден вход a = 1, b = 2, c = 3 и d = 1, h = 3 -> Изходът е: 8.
(???Не можем да съставим триъгълник с такива страни. (неравенства в триъгълник))

2) При даден вход a = b = c = d = h = 2 -> Изходът е 10.
Това е ясно. [tex]\Rightarrow[/tex] Pфигура = 5*a;

3) Вход: a = 1, b = 3, c = 1, d = 4, h = 2 -> Изход: 11.
emsihammer98
Нов
 
Мнения: 31
Регистриран на: 29 Авг 2014, 20:32
Рейтинг: 5

Re: Фигури

Мнениеот Davids » 17 Авг 2016, 20:27

Ако ти трябва програмен алгоритъм, бих предложил следното: определяш най-дългата страна от триъгълника и най-дългата от правоъгълника. След това ще долепиш фигурата с по-късата най-дълга страна към най-дългата страна на другата фигура (която най-дълга страна всъщност е най-дълга от всички). По този начин ще постигнеш минимална обиколка. Приемам, че страните са прменливи и ти трябвя алгоритъмът за работа с тях за да подтигнеш най-малката обиколка :D Имам ясна представа, но не знам дали обясненията ми са разбираеми. Ако има нещо неясно, ще допълвам, а ако кажеш и език, на който програмираш, мога да те снабдя с примерен код :D
*Нещо непосредствено и интересно, привличащо вниманието на читателя и оставящо го с приятна топла усмивка на лицето.*
----
Вече не го правя само за точката. :lol:
Davids
Математик
 
Мнения: 2394
Регистриран на: 16 Ное 2015, 11:47
Рейтинг: 2552

Re: Фигури

Мнениеот emsihammer98 » 17 Авг 2016, 23:05

Благодаря много!
И аз така направих - определих най-дългата страна на всяка от фигурите,обаче после ги долепих двете една до друга, дали се получи нещо е друг въпрос.Като че ли това, което ти каза, ми се губеше. :D

П.С1: Обаче, се усетих, че има значение коя фигура хващаш, т.е ако вземаш първо правоъгълника и след това до него долепяш триъгълника, трябва да се взема предвид, че триъгълника може да има по- голяма най-голяма страна от правоъгълника и за тази цел трябва да се използва модул.
П.С2: Иначе, кодът си тръгна(на C++).
Ако искаш, можеш да пуснеш код. Нямам нищо против нови предложения. :D
П.С3: Отново благодаря и ще се постарая следващия път да изровя нещо по-интересно и занимателно. ;)
emsihammer98
Нов
 
Мнения: 31
Регистриран на: 29 Авг 2014, 20:32
Рейтинг: 5

Re: Фигури

Мнениеот Davids » 17 Авг 2016, 23:14

Значение има, да, споменал съм горе че трябва да долепиш по-малката най-голяма страна към по-голямата (за да не стърчи и да добавя обиколка xD). Да живее програмирането! :D
П.С.: Целта на кода е само да прави калкулациите при даден вход (стойности на страните) или има и графична част?
П.С.2: Като цяло не ти е нужен модул, просто серия от няколко условия и зависещите от тях калкулации биха дали нужния резултат. Код мога да дам утре :D
*Нещо непосредствено и интересно, привличащо вниманието на читателя и оставящо го с приятна топла усмивка на лицето.*
----
Вече не го правя само за точката. :lol:
Davids
Математик
 
Мнения: 2394
Регистриран на: 16 Ное 2015, 11:47
Рейтинг: 2552

Re: Фигури

Мнениеот Davids » 18 Авг 2016, 12:40

Връщам си думите, не знам защо беше нужно да добавям това за модула (че не е нужен), но е доста по-логично с него... Кодчето е тук, направил съм го с класове, че принципно обичам така да си структурирам кодовете и да свеждам основния код до минимум, само дето не съм много вещ в C++. Скалъпено е елементарно от обща култура, съжалявам за липсващи оптимизации или очевидни пропуски с ефективността :mrgreen:
(П.П.: Принципно обичам да работя с масиви, но съм се придържал тук към буквените означения ^^)
Код: Избери целия код
#include <iostream>
#include <cmath>
#include <algorithm>
#include <stdexcept>

using namespace std;

class triangle
{
public:
    int a, b, c;

    triangle()
    {
        a = 0;
        b = 0;
        c = 0;
    }

    triangle(int a1, int b1, int c1)
    {
        a = a1;
        b = b1;
        c = c1;

        int sides[3] = {a, b, c};

        if(!allowed_length_of_sides(sides))
        {
            throw invalid_argument("Ne moje sborut na dve strani v triugulnik da e po-maluk ili raven na tretata. SYSTEM CRASH NEEDED xD");
        }
    }

    int longest()
    {
        int sides[3] = {a, b, c};
        return *max_element(sides, sides + 3);
    }

    int othertwo()
    {
        return a + b + c - longest();
    }

private:
    bool allowed_length_of_sides(int sides[3])
    {
        return !( a + b <= c ||  a + c <= b ||  b + c <= a);
    }

};

class rectangle
{
public:
    int d, h;

    rectangle()
    {
        d = 0;
        h = 0;
    }

    rectangle(int d1, int h1)
    {
        d = d1;
        h = h1;
    }

    int longest()
    {
        return max(d, h);
    }

    int otherone()
    {
        return min(d, h);
    }
};


int main()
{
    triangle tr(3, 5, 7);
    rectangle rec(10, 6);

    int tr_longest = tr.longest();
    int rec_longest = rec.longest();

    int P = tr.othertwo() + abs(tr_longest - rec_longest) + 2*rec.otherone() + rec_longest;

    cout << "Nai-malkata obikolka na dolepenite figuri e " << P << "cm."<< endl;
    return 0;
}
*Нещо непосредствено и интересно, привличащо вниманието на читателя и оставящо го с приятна топла усмивка на лицето.*
----
Вече не го правя само за точката. :lol:
Davids
Математик
 
Мнения: 2394
Регистриран на: 16 Ное 2015, 11:47
Рейтинг: 2552

Re: Фигури

Мнениеот emsihammer98 » 21 Авг 2016, 13:31

Отново благодаря!
На един от въпросите ти: Кодът само си прави калкулации при въведени от потребителя числа, графична част няма.

П.С: Все пак ми остава само да предполагам защо са дали следното условие:
Ако имаме вход a = 1, b = 2, c = 3 и d = 1, h = 3 ,то изходът е = 8.
[tex]\Rightarrow[/tex] 1 + 2 = 3
[tex]\Rightarrow[/tex] Не може да съществува такъв триъгълник и изходът не трябва да е 8, а нещо друго.
Явно са го дали така, за да не объркват децата.

П.С2: Във всеки случай си по-вещ в C++ от мен. Моят код е една идея по-прост, за да си го разбирам. :D
emsihammer98
Нов
 
Мнения: 31
Регистриран на: 29 Авг 2014, 20:32
Рейтинг: 5

Re: Фигури

Мнениеот Davids » 21 Авг 2016, 16:14

Очевидно повече ги интересува алгоритъмът и калкулациите за достигане на логически правилен изход, а тази дребна подробност със закономерностите в триъгълника очевидно е била пропусната на заден план :lol:
*Нещо непосредствено и интересно, привличащо вниманието на читателя и оставящо го с приятна топла усмивка на лицето.*
----
Вече не го правя само за точката. :lol:
Davids
Математик
 
Мнения: 2394
Регистриран на: 16 Ное 2015, 11:47
Рейтинг: 2552


Назад към Забавна математика



Кой е на линия

Регистрирани потребители: Davids, Google [Bot]

Форум за математика(архив)