Минимални трошак за сечење плоче на квадрате

Минимални трошак за сечење плоче на квадрате
Пробајте на ГфГ пракси Минимални трошак за сечење плоче на квадрате

С обзиром на таблу димензија н × м које треба исећи на н × м квадрата. Трошкови реза дуж хоризонталне или вертикалне ивице су дати у два низа:

  • к[] : Трошкови сечења дуж вертикалних ивица (по дужини).
  • и [] : Трошкови сечења дуж хоризонталних ивица (по ширини).

Пронађите минимални укупни трошак потребан за оптимално сечење плоче на квадрате.

Примери: 

Улаз: к[] = [2 1 3 1 4] и[] = [4 1 2] н = 4 м = 6
Излаз: 42
Објашњење:

У почетку бр. хоризонталних сегмената = 1 & бр. вертикалних сегмената = 1.
Оптималан начин резања на квадрат је:
Изаберите 4 (од к) -> вертикални рез Цена = 4 × хоризонтални сегменти = 4
 Сада хоризонтални сегменти = 1 вертикални сегменти = 2.
Изаберите 4 (од и) -> хоризонтални рез Цена = 4 × вертикални сегменти = 8
 Сада хоризонтални сегменти = 2 вертикална сегмента = 2.
Изаберите 3 (од к) -> вертикални рез Цена = 3 × хоризонтални сегменти = 6
 Сада хоризонтални сегменти = 2 вертикална сегмента = 3.
Изаберите 2 (од к) -> вертикални рез Цена = 2 × хоризонтални сегменти = 4
 Сада хоризонтални сегменти = 2 вертикална сегмента = 4.
Изаберите 2 (од и) -> хоризонтални рез Цена = 2 × вертикални сегменти = 8
 Сада хоризонтални сегменти = 3 вертикална сегмента = 4.
Изаберите 1 (од к) -> вертикални рез Цена = 1 × хоризонтални сегменти = 3
Сада хоризонтални сегменти = 3 вертикална сегмента = 5.
Изаберите 1 (од к) -> вертикални рез Цена = 1 × хоризонтални сегменти = 3
Сада хоризонтални сегменти = 3 вертикална сегмента = 6.
Изаберите 1 (од и) -> хоризонтални рез Цена = 1 × вертикални сегменти = 6
Сада хоризонтални сегменти = 4 вертикална сегмента = 6.
Дакле, укупни трошак = 4 + 8 + 6 + 4 + 8 + 3 + 3 + 6 = 42.

Улаз: к[] = [1 1 1] и[] = [1 1 1] н = 4 м = 4
Излаз: 15
Објашњење:
У почетку бр. хоризонталних сегмената = 1 & бр. вертикалних сегмената = 1.
Оптималан начин резања на квадрат је:
Изаберите 1 (од и) -> хоризонтални рез Цена = 1 × вертикални сегменти = 1
Сада хоризонтални сегменти = 2 вертикална сегмента = 1.
Изаберите 1 (од и) -> хоризонтални рез Цена = 1 × вертикални сегменти = 1
Сада хоризонтални сегменти = 3 вертикална сегмента = 1.
Изаберите 1 (од и) -> хоризонтални рез Цена = 1 × вертикални сегменти = 1
Сада хоризонтални сегменти = 4 вертикална сегмента = 1.
Изаберите 1 (од к) -> вертикални рез Цена = 1 × хоризонтални сегменти = 4
Сада хоризонтални сегменти = 4 вертикална сегмента = 2.
Изаберите 1 (од к) -> вертикални рез Цена = 1 × хоризонтални сегменти = 4
Сада хоризонтални сегменти = 4 вертикална сегмента = 3.
Изаберите 1 (од к) -> вертикални рез Цена = 1 × хоризонтални сегменти = 4
Сада хоризонтални сегменти = 4 вертикална сегмента = 4
Дакле, укупни трошак = 1 + 1 + 1 + 4 + 4 + 4 = 15.

Садржај

[Наивни приступ] Пробајте све пермутације - О((н+м)!×(н+м)) Време и О(н+м) простор

Идеја је да се генеришу све могуће пермутације датих резова и затим израчунају трошкови за сваку пермутацију. Коначно вратите минимални трошак међу њима.

Напомена: Овај приступ није изводљив за веће инпуте јер број пермутација расте факторски као (м+н-2)!.
За сваку пермутацију морамо израчунати цену у О(м+н) времену. Отуда укупна временска сложеност постаје О((м+н−2)!×(м+н)).

[Очекивани приступ] Коришћење похлепне технике - О( н (лог н)+м (лог м)) Време и О(1) простор

Идеја је да се прво направе најскупљи резови користећи а похлепан приступ . Запажање је да одабир највећег смањења трошкова у сваком кораку смањује будуће трошкове тако што утиче на више комада одједном. Ми сортирамо вертикално (к) и хоризонтално (и) смањење трошкова у опадајућем редоследу, а затим итеративно бирамо већи да бисмо максимизирали уштеде. Преостали резови се обрађују одвојено како би се осигурало да су сви делови оптимално подељени.

Шта се дешава када направимо рез?

  • Хоризонтални рез → сечете по ширини тако да се повећава број хоризонталних трака (хЦоунт++). Али цена се множи са вЦоунт (број вертикалних трака) јер хоризонтални рез мора да прође кроз све вертикалне сегменте.
  • Вертикални рез → сечете по висини тако да се број вертикалних трака повећава (вЦоунт++). Али цена се множи са хЦоунт (број хоризонталних трака) јер вертикални рез мора да прође кроз све хоризонталне сегменте.

Кораци за решавање проблема:

  • Сортирајте и к и и низови у опадајућем редоследу.
  • Користите два показивача, један за к и један за и почевши од највеће вредности и померајући се ка мањим вредностима.
  • Одржавајте хЦоунт и вЦоунт да бисте пратили на колико сегмената утиче сваки рез и ажурирајте их у складу са тим.
  • Итерирајте док и к и  и имају необрађене резове и увек бирате већи трошак да бисте минимизирали укупне трошкове.
  • Ако к има преостале резове, обрадите их множитељем хЦоунт; на сличан начин обрадите преостале и резове помоћу вЦоунт.
  • Акумулирајте укупне трошкове у сваком кораку користећи формулу: смањите цену * број погођених делова да бисте обезбедили минималне трошкове.
C++
   #include       #include      #include       using     namespace     std  ;   int     minCost  (  int     n       int     m           vector   <  int  >&     x       vector   <  int  >&     y  )     {          // Sort the cutting costs in ascending order      sort  (  x  .  begin  ()     x  .  end  ());      sort  (  y  .  begin  ()     y  .  end  ());         int     hCount     =     1       vCount     =     1  ;         int     i     =     x  .  size  ()     -     1       j     =     y  .  size  ()     -     1  ;         int     totalCost     =     0  ;      while     (  i     >=     0     &&     j     >=     0  )     {          // Choose the larger cost cut to       // minimize future costs      if     (  x  [  i  ]     >=     y  [  j  ])     {      totalCost     +=     x  [  i  ]     *     hCount  ;         vCount  ++  ;      i  --  ;      }         else     {      totalCost     +=     y  [  j  ]     *     vCount  ;         hCount  ++  ;      j  --  ;      }      }      // Process remaining vertical cuts      while     (  i     >=     0  )     {      totalCost     +=     x  [  i  ]     *     hCount  ;      vCount  ++  ;      i  --  ;      }      // Process remaining horizontal cuts      while     (  j     >=     0  )     {      totalCost     +=     y  [  j  ]     *     vCount  ;      hCount  ++  ;      j  --  ;      }      return     totalCost  ;   }   int     main  ()     {          int     n     =     4       m     =     6  ;      vector   <  int  >     x     =     {  2       1       3       1       4  };      vector   <  int  >     y     =     {  4       1       2  };      cout      < <     minCost  (  n       m       x       y  )      < <     endl  ;      return     0  ;   }   
Java
   import     java.util.Arrays  ;   class   GfG     {          static     int     minCost  (  int     n       int     m           int  []     x       int  []     y  )     {          // Sort the cutting costs in ascending order      Arrays  .  sort  (  x  );      Arrays  .  sort  (  y  );         int     hCount     =     1       vCount     =     1  ;         int     i     =     x  .  length     -     1       j     =     y  .  length     -     1  ;         int     totalCost     =     0  ;      while     (  i     >=     0     &&     j     >=     0  )     {          // Choose the larger cost cut to       // minimize future costs      if     (  x  [  i  ]     >=     y  [  j  ]  )     {      totalCost     +=     x  [  i  ]     *     hCount  ;         vCount  ++  ;      i  --  ;      }         else     {      totalCost     +=     y  [  j  ]     *     vCount  ;         hCount  ++  ;      j  --  ;      }      }      // Process remaining vertical cuts      while     (  i     >=     0  )     {      totalCost     +=     x  [  i  ]     *     hCount  ;      vCount  ++  ;      i  --  ;      }      // Process remaining horizontal cuts      while     (  j     >=     0  )     {      totalCost     +=     y  [  j  ]     *     vCount  ;      hCount  ++  ;      j  --  ;      }      return     totalCost  ;      }      public     static     void     main  (  String  []     args  )     {          int     n     =     4    m     =     6  ;      int  []     x     =     {  2       1       3       1       4  };      int  []     y     =     {  4       1       2  };      System  .  out  .  println  (  minCost  (  n       m       x       y  ));      }   }   
Python
   def   minCost  (  n    m     x     y  ):   # Sort the cutting costs in ascending order   x  .  sort  ()   y  .  sort  ()   hCount     vCount   =   1     1   i     j   =   len  (  x  )   -   1     len  (  y  )   -   1   totalCost   =   0   while   i   >=   0   and   j   >=   0  :   # Choose the larger cost cut to    # minimize future costs   if   x  [  i  ]   >=   y  [  j  ]:   totalCost   +=   x  [  i  ]   *   hCount   vCount   +=   1   i   -=   1   else  :   totalCost   +=   y  [  j  ]   *   vCount   hCount   +=   1   j   -=   1   # Process remaining vertical cuts   while   i   >=   0  :   totalCost   +=   x  [  i  ]   *   hCount   vCount   +=   1   i   -=   1   # Process remaining horizontal cuts   while   j   >=   0  :   totalCost   +=   y  [  j  ]   *   vCount   hCount   +=   1   j   -=   1   return   totalCost   if   __name__   ==   '__main__'  :   n    m   =   4     6   x   =   [  2     1     3     1     4  ]   y   =   [  4     1     2  ]   print  (  minCost  (  n    m    x     y  ))   
C#
   using     System  ;   class     GfG     {      public     static     int     minCost  (  int     n       int     m           int  []     x       int  []     y  )     {          // Sort the cutting costs in ascending order      Array  .  Sort  (  x  );      Array  .  Sort  (  y  );      int     hCount     =     1       vCount     =     1  ;      int     i     =     x  .  Length     -     1       j     =     y  .  Length     -     1  ;      int     totalCost     =     0  ;      // Process the cuts in greedy manner      while     (  i     >=     0     &&     j     >=     0  )     {          // Choose the larger cost cut to       // minimize future costs      if     (  x  [  i  ]     >=     y  [  j  ])     {      totalCost     +=     x  [  i  ]     *     hCount  ;      vCount  ++  ;      i  --  ;      }      else     {      totalCost     +=     y  [  j  ]     *     vCount  ;      hCount  ++  ;      j  --  ;      }      }      // Process remaining vertical cuts      while     (  i     >=     0  )     {      totalCost     +=     x  [  i  ]     *     hCount  ;      vCount  ++  ;      i  --  ;      }      // Process remaining horizontal cuts      while     (  j     >=     0  )     {      totalCost     +=     y  [  j  ]     *     vCount  ;      hCount  ++  ;      j  --  ;      }      return     totalCost  ;      }          public     static     void     Main  ()     {          int     n  =  4    m  =  6  ;      int  []     x     =     {  2       1       3       1       4  };      int  []     y     =     {  4       1       2  };      Console  .  WriteLine  (  minCost  (  n    m       x       y  ));      }   }   
JavaScript
   function     minCost  (     n    m       x       y  )     {          // Sort the cutting costs in ascending order      x  .  sort  ((  a       b  )     =>     a     -     b  );      y  .  sort  ((  a       b  )     =>     a     -     b  );      let     hCount     =     1       vCount     =     1  ;      let     i     =     x  .  length     -     1       j     =     y  .  length     -     1  ;      let     totalCost     =     0  ;      while     (  i     >=     0     &&     j     >=     0  )     {          // Choose the larger cost cut to       // minimize future costs      if     (  x  [  i  ]     >=     y  [  j  ])     {      totalCost     +=     x  [  i  ]     *     hCount  ;      vCount  ++  ;      i  --  ;      }         else     {      totalCost     +=     y  [  j  ]     *     vCount  ;      hCount  ++  ;      j  --  ;      }      }      // Process remaining vertical cuts      while     (  i     >=     0  )     {      totalCost     +=     x  [  i  ]     *     hCount  ;      vCount  ++  ;      i  --  ;      }      // Process remaining horizontal cuts      while     (  j     >=     0  )     {      totalCost     +=     y  [  j  ]     *     vCount  ;      hCount  ++  ;      j  --  ;      }      return     totalCost  ;   }   // Driver Code   let     n     =     4    m     =     6  ;   let     x     =     [  2       1       3       1       4  ];   let     y     =     [  4       1       2  ];   console  .  log  (  minCost  (  n    m       x       y  ));   

Излаз
42