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

C++での絶対値式の最大値


同じ長さの整数の配列が2つあるとすると、次の最大値を見つける必要があります。| arr1 [i] --arr1 [j] | + | arr2 [i]-arr2 [j] | + | i--j|。ここで、最大値はすべての0 <=i、j

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

  • 配列vを取得するgetValというメソッドを定義します

  • maxVal:=-inf、minVal:=inf

  • 0からvのサイズまでの範囲のiの場合

    • minVal:=v[i]とminValの最小値

    • maxVal:=v[i]とmaxValの最大値

  • maxVal – minVal

    を返します
  • メインの方法から、次のようにします

  • サイズ4の配列retを作成します

  • n:=arr1のサイズ

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

    • arr1 [i] – arr2 [i]+iをret[0]

      に挿入します
    • arr1 [i] + arr2 [i]+iをret[1]

      に挿入します
    • arr1 [i] –arr2[i]-iをret[2]

      に挿入します
    • arr1 [i] +arr2[i]-iをret[3]

      に挿入します
  • ans:=-inf

  • 0から3の範囲のiの場合

    • ans:=ansとgetVal(ret [i])の最大値

  • ansを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int getVal(vector <int>& v){
      int maxVal = INT_MIN;
      int minVal = INT_MAX;
      for(int i = 0; i < v.size(); i++){
         minVal = min(v[i], minVal);
         maxVal = max(v[i], maxVal);
      }
      return maxVal - minVal;
   }
   int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
      vector <int> ret[4];
      int n = arr1.size();
      for(int i = 0; i < n; i++){
         ret[0].push_back(arr1[i] - arr2[i] + i);
         ret[1].push_back(arr1[i] + arr2[i] + i);
         ret[2].push_back(arr1[i] - arr2[i] - i);
         ret[3].push_back(arr1[i] + arr2[i] - i);
      }
      int ans = INT_MIN;
      for(int i = 0; i < 4; i++){
         ans = max(ans, getVal(ret[i]));
      }
      return ans;
   }
};
main(){
   vector<int> v1 = {1,2,3,4}, v2 = {-1, 4, 5, 6};
   Solution ob;
   cout << (ob.maxAbsValExpr(v1, v2));
}

入力

[1,2,3,4]
[-1,4,5,6]

出力

13

  1. 代数式の最大値を見つけるためのC++プログラム

    これは、任意の代数式の最大値を見つけるためのC ++プログラムです。(x1 + x2 + x3+。。。+xa)*(y1 + y2+。。。+yb)および(a + b )整数が与えられます。数値と残りのb数値のすべての可能な組み合わせを検討し、それらの値を計算して、そこから最大値を導き出すことができます。 アルゴリズム Begin    function MaxValue() :    Arguments:    a[]=array which store the elements.    x, y=integers.

  2. C++でのラムダ式

    C ++ STLには、std::for_eachのような便利なジェネリック関数が含まれています。残念ながら、特に適用したいファンクターが特定の機能に固有である場合は、使用するのが非常に面倒になる可能性があります。したがって、作成するこの関数は、その1つの場所で使用されている名前空間に含まれます。これに対する解決策は、無名関数を使用することです。 C++ではC++11にラムダ式が導入され、無名関数を作成できるようになりました。たとえば、 例 #include<iostream> #include<vector> #include <algorithm> //