P2115 [USACO14MAR]破壊(二値の答え)

文字列の数を考えると、中央部分を削除するように求められ、残りはどのくらいの平均最小です。

それは半分を考えるのは簡単ではありません。

$ソリューション:$

少し式をプレイするハンド:

第容易プレフィックスに発生し、接頭辞は1に$ I $ sum_i表し、そう簡単にはO(1)クエリ間隔及び/微分することができます

最小平均としてバイナリミッド。

仮定R&LT省略間隔〜L(LRが削除されます)

平均に等しいです。

$のAVE = {sum_ {I-1} + sum_ {ニュージャージー}} / {N-(J-I + 1)} $

だから、ここ単調があります:

当量のAVEの$ \ $中旬

少し顔を変形し、取得

$ sum_n-sum_j + sum_ {I-1} \当量の中間* N-MID * jを+中間*(I-1)$

その

$(sum_n-MID * n)で\ GEQ(sum_j-MID * J) - (sum_ {I-1} -mid *(I-1)$

令$ sum_i-I *半ば$ = $ C_I $

私たちは、決定する必要があります

$ C_N \ GEQ C_j - C_ {I-1} $

あなたはバイナリ境界を決定することができます。

複雑$ O(n)と$

下側の境界にはほとんど関心が、アウトにできるようになります。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 MAXN = 1E5 + 233 ダブル合計[MAXN]。
int型のn;
二重C [MAXN]。
ダブルMAXX [MAXN]。
ダブルミネソタ州[MAXN]。
ブールチェック(ダブルX)
{ 
    ためint型 i = 0 ; iが<= N; iは++ 
    { 
        C [I] =和[I] -i * X。
    } 
    ミネソタ州[ 1 ] = Cを[ 1 ]。
    以下のためのint型 I = 2; iが<= N; iは++ 
    { 
        ミネソタ[I] =分(C [i]は、ミネソタ州[I- 1 ])。
    } 
    [N MAXX - 1 ] = C [N- 1 ]。
    以下のためにint型、I = N- 2、I> = 1 ; i-- 
    { 
        MAXX [I] = MAX(C [i]は、MAXX [I + 1 ])。
    } 
    のためのint型 I = 2 ; iが<N; iが++ 
    { 
        場合(MAXX [I] -minn [I- 1 ]> C [N])
         リターン 1 
    } 
    リターン 0 ; 
} 
int型のmain()
{ 
    scanf関数(" %のD "、&N)
    以下のためにint型 i = 1 ; iが++; iが<= N 
    { 
        二重Xと、
        scanf関数(" %のLF "、&x)は、
        和[I] =和[I- 1 ] + X。
    } 
    ダブル L = 0、R = 1E4 + 233 一方、((RL)> 0.000000001 
    { 
        ダブルミッド=(L + R)/ 2 もし(チェック(MID)== 0 
        L = ミッド。
        他の
        R = ミッド; 
    } 
    のprintf(" %の.3lf " 、L)。
    リターン 0 ; 
}

(終わり)

 

おすすめ

転載: www.cnblogs.com/ajmddzp/p/11772904.html