C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

チョコレートをC++で分割する


いくつかのチャンクで構成されるチョコレートバーが1つあるとします。各チャンクには、甘さと呼ばれるリストによって与えられる独自の甘さがあります。 K人の友達の間でチョコレートを共有したいので、Kカットを使用してチョコレートバーをK + 1ピースにカットし始めると、各ピースはいくつかの連続したチャンクで構成されます。総甘さを最小限に抑えた作品を取り出し、他の作品を友達にあげれば。チョコレートバーを最適にカットすることで、得られる最大の総甘さを見つける必要があります。

したがって、入力が甘さ=[1,2,3,4,5,6,7,8,9]、K =5のようである場合、チョコレートを[1,2に分割できるため、出力は6になります。 、3]、[4,5]、[6]、[7]、[8]、[9]これらのピース。

これを解決するには、次の手順に従います-

  • 関数ok()を定義します。これは、配列v、cuts、maxVal、

    を取ります。
  • カウンター:=0、温度:=0

  • 初期化i:=0の場合、i <=vのサイズの場合、更新(iを1増やします)、実行-

    • temp> =maxValの場合、

      • (カウンターを1増やします)

      • temp:=0

    • iがvのサイズと同じである場合、-

      • ループから出てきます

    • temp:=temp + v [i]

  • カウンター>=カット

    の場合はtrueを返します
  • メインの方法から、次の手順を実行します。

  • maxa:=-1

  • n:=sのサイズ

  • 低:=0、高:=0

  • 初期化i:=0の場合、i

    • low:=lowとs[i]

      の最小値
    • 高:=高+ s [i]

  • (1ずつ高くします)

  • 低<高、実行-

    • 中:=低+(高-低+ 1)/ 2

    • ok(s、k + 1、mid)が真の場合、-

      • 低:=中

    • それ以外の場合

      • 高:=中-1

  • ローに戻る

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool ok(vector <int> v, int cuts, int maxVal){
      int counter = 0;
      int temp = 0;
      for (int i = 0; i <= v.size(); i++) {
         if (temp >= maxVal) {
            counter++;
            temp = 0;
         }
         if (i == v.size()) {
            break;
         }
         temp += v[i];
      }
      return counter >= cuts;
   }
   int maximizeSweetness(vector<int>& s, int k) {
      int maxa = -1;
      int n = s.size();
      int low = 0;
      int high = 0;
      for (int i = 0; i < n; i++) {
         low = min(low, s[i]);
         high += s[i];
      }
      high++;
      while (low < high) {
         int mid = low + (high - low + 1) / 2;
         if (ok(s, k + 1, mid))
            low = mid;
         else
            high = mid - 1;
      }
      return low;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3,4,5,6,7,8,9};
   cout << (ob.maximizeSweetness(v, 5));
}

入力

{1,2,3,4,5,6,7,8,9}, 5

出力

6

  1. C++で2つの整数を除算する

    2つの整数の被除数と除数があるとします。乗算、除算、モジュロ演算子を使用せずに2つの整数を除算する必要があります。被除数を除数で割った後、商を返します。整数除算はゼロに向かって切り捨てる必要があります。両方の入力は整数です したがって、与えられた入力が被除数=7、除数=-3の場合、出力は-2になります。 これを解決するには、次の手順に従います- 2つの引数xとyを取ると、xがyを除算することを示します x<-Infinityおよびy=1の場合、無限大を返します a:=| x |、b:=| y |およびans:=0 =0 p:=0 =0 p:=p + 1 a:=a

  2. C ++でゼロ除算エラーをキャッチする方法は?

    以下は、ゼロ除算エラーをキャッチする例です。 例 #include <iostream> using namespace std; int display(int x, int y) {    if( y == 0 ) {       throw "Division by zero condition!";    }    return (x/y); } int main () {    int a = 50;    int b =