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

C++のキャンディー


N人の子供がいて、並んでいるとします。ここでは、各子に評価値が割り当てられています。以下の要件を満たしたこれらの子供たちにキャンディーを供給しています-

  • 各子供は少なくとも1つのキャンディーを持っている必要があります。

  • 評価が高い子供は、隣人よりも多くのキャンディーを手に入れます。

与える必要のあるキャンディーの最小数を見つける必要がありますか?

したがって、入力が[1,1,3]の場合、出力は4になります。したがって、それぞれ1、1、2個のキャンディーが得られます。

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

  • n:=配列の評価のサイズ、サイズnのdpという配列を作成し、1を使用してこれを埋めます

  • ret:=0

  • 1からn–1の範囲のiの場合

    • 評価[i]>評価[i– 1]の場合、dp [i]:=dp [i-1] + 1

  • n-2から0までの範囲のiの場合

    • 評価[i]>評価[i+1]の場合、dp [i]:=dp[i]とdp[i+ 1]+1の最大値

  • ret:=dpの要素の合計

  • retを返す

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int candy(vector<int>& ratings) {
      int n = ratings.size();
      vector <int> dp(n, 1);
      int ret = 0;
      for(int i = 1; i < n; i++){
         if(ratings[i] > ratings[i - 1]){
            dp[i] = dp[i - 1] + 1;
         }
      }
      for(int i = n - 2; i >= 0; i--){
         if(ratings[i] > ratings[i + 1]){
            dp[i] = max(dp[i], dp[i + 1] + 1);
         }
      }
      for(int i = 0; i < n; i+=1){
         ret += dp[i];
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,1,3};
   cout << (ob.candy(v));
}

入力

[1,1,3]

出力

4

  1. C++でのリスのシミュレーション

    木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で

  2. C++の長方形エリアII

    (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r