Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

 

Задача по програмиране C++

Featured Replies

Здравейте! Изпитвам затруднение с една задача по програмиране C++.

Някой може ли да ми помогне?  

За тези, които  няма да помагат и ще пишат безсмислени  коментари  от типа на: тази задача е лесна, научи: циклите,операторите и функциите и тогава пиши форум - моля да напуснат! Знам всички оператори, функции и цикли. Не съм назад с материала. :)

Благодаря за вниманието! 

Ето го и условието!

 

Дадено:

Мед:

1кг акациев - А1 лева
1кг. липов -А2 лева
1кг.слънчогледов - А3 лева.


Има 3 съда:
1 съд - B1 кг.
2 съд - B2 кг.
3 съд - B3 кг.
В кой съд какъв мед да сложи така че да получи най-много пари?

 

Решение:

Вход: ред 1 -> числата A1  A2  A3
Ред 2: числата B1 B2 и B3

Изход: едно число - максималната печалба, която може да се получи.

Пример: Вход -> 7 2 9
10 5 3

Изход: 131лв.

 

Пускам и cpp файла 

 

task4.cpp

Нещо не разбирам условието на задачата. 1 КГ МЕД си е 1 КГ МЕД ако щеш го сложи в епруветка., И цената ще си е една и съща.

преди 10 минути, Емил Костов написа:

Нещо не разбирам условието на задачата. 1 КГ МЕД си е 1 КГ МЕД ако щеш го сложи в епруветка., И цената ще си е една и съща.

Образно казано. Или си представи, че всеки съд е с различна вместимост - 1,2,3 КГ. За задачата - намираш най-голямата цена на меда, след това най-големия буркан и умножаваш двете. Ако беше на джава, щях да ти я драсна набързо. Ако знаеш циклите, прецикляш набързо в 2 цикъла най-големите стойности и умножаваш накрая.

@Raze май се търси всичко, т.е. да напълниш и трите съда. Ако съм прав, подреждат се и съдовете по големина от най-голям към най-малък (примерно от M1 до M3), различните видове мед по цена от най-скъп към най-евтин (от N1 до N3), и се умножават, и на изхода имаш M1*N1 + M2*N2 + M3*N3.

Да, прав си :)

Правят се 2 тримерни масива, в които се зареждат числата, след това и двата масива се сортират, без значение дали първо ще са най-големите или на-малките числа, въпроса е ако сортираш единия масив с начало най-голямото число, така да направиш и другия или обратното, след това се умножават и събират стойностите от всеки масив.

Сложил съм doble за да може бурканя да е 2.5 кг примерно, а меда с цена 9.54 лв

Като гледам резултата, за най-голяма сума слагаш най-скъпия мед в най-големия буркан и най-евтиния в най-малкия. 

#include <iostream>

using namespace std;

void swap (double &x, double &y)
{
     double t = x;
     x = y;
     y = t;
}
    
int main ( )
{

    double A1, A2, A3, B1, B2, B3, SUM;

    cout <<"A1 = "; cin>>A1;
    cout <<"A2 = "; cin>>A2;
    cout <<"A3 = "; cin>>A3;
    cout <<"B1 = "; cin>>B1;
    cout <<"B2 = "; cin>>B2;
    cout <<"B3 = "; cin>>B3;
    
    if (A1<A2) swap(A1,A2);
    if (A2<A3) swap(A2,A3);
    if (A1<A2) swap(A1,A2);
    
    if (B1<B2) swap(B1,B2);
    if (B2<B3) swap(B2,B3);
    if (B1<B2) swap(B1,B2);
    
    SUM=A1*B1+A2*B2+A3*B3;
    
    cout<<A1<<" * "<<B1<<" + "<<A2<<" * "<<B2<<" + "<<A3<<" * "<<B3;
    cout<<" = "<<SUM<<endl;

 

  • Автор
преди 7 часа, ined написа:

Сложил съм doble за да може бурканя да е 2.5 кг примерно, а меда с цена 9.54 лв

Като гледам резултата, за най-голяма сума слагаш най-скъпия мед в най-големия буркан и най-евтиния в най-малкия. 


#include <iostream>

using namespace std;

void swap (double &x, double &y)
{
     double t = x;
     x = y;
     y = t;
}
    
int main ( )
{

    double A1, A2, A3, B1, B2, B3, SUM;

    cout <<"A1 = "; cin>>A1;
    cout <<"A2 = "; cin>>A2;
    cout <<"A3 = "; cin>>A3;
    cout <<"B1 = "; cin>>B1;
    cout <<"B2 = "; cin>>B2;
    cout <<"B3 = "; cin>>B3;
    
    if (A1<A2) swap(A1,A2);
    if (A2<A3) swap(A2,A3);
    if (A1<A2) swap(A1,A2);
    
    if (B1<B2) swap(B1,B2);
    if (B2<B3) swap(B2,B3);
    if (B1<B2) swap(B1,B2);
    
    SUM=A1*B1+A2*B2+A3*B3;
    
    cout<<A1<<" * "<<B1<<" + "<<A2<<" * "<<B2<<" + "<<A3<<" * "<<B3;
    cout<<" = "<<SUM<<endl;

 

Благодаря ти много!

Това е вид "транспортна задача". Намерете алгоритъма за решаване на въпросната. До колкото си спомням бяха два метода.

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

Успех!

@ined този алгоритъм не ми изглежда много ефективен. Ако се наложи да се увеличава размера на масива или е много по-голям, за всеки елемент ли ще правиш ръчна проверка? Много по-добре е да се направи така:

https://www.geeksforgeeks.org/sort-c-stl/

Алгоритъма си е Bubble Sort , никъде не съм твърдял че е много ефективен, но за само 3 елемента си е достатъчно добър, даже може да мине и без масиви и цикли.

Така е, но по-добре го направи с цикъл. Дори и автора да е начинаещ в програмирането е добре да се учи да пише хубав код:

https://www.geeksforgeeks.org/bubble-sort/

Ето математическа идея за решението.

Дадени са цените A[0], A[1], A[2] за 1 kg.

Дадени са и вместимостите на съдовете B[0], B[1], B[2] във kg.

Общата цена е p:

B[0]*x + B[1]*y + B[2]*z = p

където

x,y,z in {A[0], A[1], A[2]}

Търси се тройка не равни помежду си (x,y,z), при която се достига максимума на функцията p:
(x,y,z) => max p


Основната част на програмата, която (тъпо) изрежда всички пермутации на трите {A[0], A[1], A[2]}:

pmax = B[0] * A[0] + B[1] * A[0] + B[2] * A[0];
M[0] = 0;
M[1] = 0;
M[2] = 0;
for(i = 0; i < 3; i++) {
  for(j = 0; j < 3; j++) {
    for(k = 0; k < 3; k++) {
      p = B[0] * A + B[1] * A[j] + B[2] * A[k];
      if ((p > pmax) && (i != j) && (i != k) && (j != k)) {
          pmax = p;
          M[0] = i;
          M[1] = j;
          M[2] = k;
      }
    }
  }
}

Максимално достижимата цена е pmax,
при (A[M[0]], A[M[1]], A[M[2]]).

 

Поправка, нещо липсваше, трябва да бъде:

 p = B[0]  * A + B[1] * A[j] + B[2] * A[k];

 

но на първото A не се изписа индекс i

Аз мисля, че сме решили задачата - сортират се масивите, както съм обяснил и след това се умножават и събират елементите последователно.

преди 17 часа, NVJ написа:

Ето математическа идея за решението.

.....

Според твойта "математическа" идея пермутации се смятат с цикли и проверки ама не е така, ко правим с 10 елемента - ще се накъсаме от циклене :)

Само с 5 размени на два елемента се изреждат всичките 6 пермутации на 3 елемента, а не проверяваш 27 вариации дали няма в тях повтарящи се елементи,

A  B  C
1  2  3   swap(A,B)
2  1  3   swap(B,C)
2  3  1   swap(A,B)
3  2  1   swap(B,C)
3  1  2   swap(A,B)
1  3  2

 

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.