銀河

銀河

一次元座標軸n個の点で与えられ、i番目の点の座標\(X_Iを\) あなたは今、それらの差異を最小限に、任意のk個の点を移動することができ、\(N \のLeq 50000 \)

ソリューション

セット\(\バー{X} = FRAC {\ sum_。1 = {I}} ^ {N-nx_i} \ \)、容易に知られている分散

\ [\ sum_ {i = 1} ^ N(x_i- \バー{X})^ 2 = \ sum_ {i = 1} ^ nx_i ^ 2-Nの\バー{X} ^ 2 \]

二次関数には明らかなように、唯一の視点座標xを移動させる、すなわち、

\(F(X)= \ sum_ {i = 1} ^ {N X_I} ^ 2-Nの\バー{X} ^ 2 \)

簡素化が複雑すぎるので、それはガイドを評価され、そのX項目の独立したが失われる可能性が

\ [F(X) '=(\ sum_ {i = 1} ^ nは{X_I} ^ 2-Nの\バー{X} ^ 2)' = 2X-N(\バー{X} ^ 2) '= 2X -n2 \バー{X}(\バー{X}) '= \]
\ [2X-2 \バー{X}(\ sum_ {i = 1} ^ nx_i)' = 2X-2 \バー{X} \ ]

簡単増加Xと知って、ガイド機能が単調増加であり、それは最小値が存在する、よどみ点でそれように、取るに明らかである\(F(X)「= 0 \) そこ

\(X = \バー{X} \ RIGHTARROW X = \ FRAC {\ sum_ {i = 1} ^ nx_i-X} {N-1} \)

だから、xが答えである点以外平均ポイントを得るために、X、我々はその平均に追加し、設定された番号に結論を得ることができ、座標xの観点からだけで動くため、新しいコレクションを変更しません。平均。

しかし、我々は、各点のためになるよう、ケースのk個のポイントを議論する必要があります\(X_I \)私たちが持っている(のはしているk個のポイントを仮定しましょう(X_1、X_2、...、X_K \)\、その後、それぞれ、)を

\ [X_1 = FRAC \ FRAC {\ sum_ {i = 1} ^ nx_i-X_1} {N-1}、X_2 = \ {\ sum_ {i = 1} ^ nx_i-X_2} {N-1}··· \]
\ [X_K = \ FRAC {\ sum_ {i = 1} ^ nx_i-X_K} {N-1} \]

そこまで追加

\ [(N-1)\ sum_ {i = 1} ^ kx_i = K \ sum_ {i = 1} ^ nx_i- \ sum_ {i = 1} ^ kx_i \]

即ち

\ [n個の\ sum_ {i = 1} ^ kx_i = K \ sum_ {i = 1} ^ nx_i \]

即ち

\ [\ FRAC {\ sum_ {i = 1} ^ kx_i} {K} = FRAC \ {\ sum_ {i = 1} ^ nx_i} {N} \]

だから我々は、n個の数の正確平均移動可能にkの平均数を取得し、取得し続け

\ [n個の\ sum_ {i = 1} ^ kx_i = K \ sum_ {i = 1} ^ nx_i \ RIGHTARROW n個の\ sum_ {i = 1} ^ kx_i = K \ sum_ {i = 1} ^ kx_i + K \ sum_ {I = K + 1} ^ nx_i \]

\ [(NK)\ sum_ {i = 1} ^ kx_i = K \ sum_ {i = K + 1} ^ nx_i \]

即ち

\ [\ FRAC {\ sum_ {i = 1} ^ kx_i} {K} = FRAC \ {\ sum_ {i = K + 1} ^ nx_i} {NK} \]

また、そこまで仕上げています

\ [\ FRAC {\ sum_ {i = 1} ^ kx_i} {K} = FRAC {\ sum_ {i = K + 1} ^ nx_i} {NK} = \ FRAC {\ sum_ {i = 1} ^ nx_i \ } {N} \]

だから、偉大な結論はセットの平均値の変更のための一連の平均に番号を追加し、描画することができ、元のコレクションの平均に等しい同じ平均は、新しいコレクションの平均に等しい平均数に加算しましたそれが等しい3を起動することができ、両者が等しい会います。

今の分散の数kを考慮し、分散は明らかに良く、次の式を研究するために変換しました

\ [\ sum_ {i = 1} ^ nx_i ^ 2-Nの\バー{X} ^ 2 \]

NK残り数(平均値など)は一定であり、開いています

\ [\ sum_ {i = 1} ^ kx_i ^ 2 + \ sum_ {i = K + 1} ^ {n}はX_I ^ 2-Nの\バー{X} ^ 2 \]

だから、最小化され、全体の方程式が最小化されてみましょう

\ [\ sum_ {i = 1} ^ nx_i ^ 2 = X_1 ^ 2 + X_2 ^ 2 + ... + X_K ^ 2 \]

平均不平等を従えば、簡単に満たすために、この式を最小限に理解する\を(X_1 = X_2 = ... = X_K \)

そして、我々はしている(\ {FRAC X_1 + X_2 + ... + KのX_K}} = {\ FRACのkx_1} {} {K = X_1 = \バー{X} \)\、そうそこに

\ [X_1 = X_2 = ... = X_K = \バー{X} = \ FRAC {\ sum_ {i = K + 1} ^ {NK} X_I} {NK} \]

Kは、この数のために、私たちは、分散スタイルの定義によると、平均的にデジタルの場所のすべての残りの部分を入れています。

\ [\ sum_ {i = 1} ^ N(x_i- \バー{X})^ 2 \]

知るやすいため、kの番号が生成され、この時間は、ゼロである\(X_I = \バー{X }(i = 1,2、...、k)が\)

限り、我々は残りのNK桁の分散が可能考慮するとして、可能な限り集中して実際の分散の意味、デジタルなので、残りのNK桁の分散の程度に応じて、私たちは唯一の連続した長さを取るのすべての並べ替えを調整する必要があります\(\ NK)の範囲、それらの分散は、当社のプロモーション式に従って、迅速分散を見つけるために、最大を取ることができます

\ [\ sum_ {i = 1} ^ nx_i ^ 2-Nの\バー{X} ^ 2 \]

そして\(\バー{X} = \ FRAC {\ sum_。1 = {I}} ^ {N-nx_i} \) あれば、我々は共通のプレフィックスとプレフィックスと正方形を維持するように、この式の計算に、それ行うことができます\(O(1)\)クエリ間隔の分散を、全体の時間の複雑さがあるだけで\(O(N)\)

参照コード:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define il inline
#define ri register
#define lb double
#define Size 50500
using namespace std;
lb a[Size],sum[Size],sum2[Size];
int main(){
    int lsy,n,k;scanf("%d",&lsy);
    while(lsy--){
        scanf("%d%d",&n,&k);
        for(int i(1);i<=n;++i)
            scanf("%lf",&a[i]);
        if(n==k){printf("%.11lf\n",(lb)0);continue;}
        sort(a+1,a+n+1);lb ans(1e100);k=n-k;
        for(int i(1);i<=n;++i)
            sum[i]=sum[i-1]+a[i],
                sum2[i]=sum2[i-1]+a[i]*a[i];
        for(int i(k);i<=n;++i)
            ans=min(ans,sum2[i]-sum2[i-k]-k*pow((sum[i]-sum[i-k])/k,2));
        printf("%.11lf\n",ans);
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/a1b3c7d9/p/11408652.html