2

問題

整数の配列の関数を計算する必要があります。配列のすべての 3 要素サブセット (またはトリプレット) について、項 floor((トリプレットの合計)/(トリプレットの積)) を計算する必要があります。次に、そのようなすべての項の合計を返す必要があります。

入力 (長さ; 配列):

5
1 2 1 7 3

出力:

6

説明

次のトリプレットが指定された配列に存在します。

1 2 1

1 2 7

1 2 3

1 1 7

1 1 3

1 7 3

2 1 7

2 1 3

2 7 3

1 7 3

サンプル入力からのこれらのトリプレットを考慮してください。

floor((1+2+1)/(1*2*1)) = floor(4/2) = 2 なので、1 2 1 は 2 になります。

1 2 3 貢献する 1

1 1 7 貢献する 1

1 1 3 貢献する 1

2 1 3 貢献する 1

他のすべてのトリプレットは合計に 0 を加えます。

したがって、答えは (2+1+1+1+1)=6 です。

私の解決策

私が試したのは、複雑さ O(n^3) です。コードを以下に示します。

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    long t,n[300005],sum=0,mul=1,i,j,k,res=0;
    cin >> t;

    for(i=0;i<t;i++)
        cin >>n[i];


    for(i=0;i<t-2;i++)
    for(j=i+1;j<t-1;j++)
    for(k=j+1;k<t;k++)
    {
        sum = n[i]+n[j]+n[k];
        mul = n[i]*n[j]*n[k];
        res += floor(sum/mul);
    }

    cout << res << endl;
    return 0;
}

より良い最適化のヒントはありますか?

4

1 に答える 1