順列にテスト190801 codechefパーティション

http://www.codechef.com/download/translated/LTIME70/mandarin/PERMPART.pdf

どうやら以上$ 2 * Nの$番号を残すことができるだけ

私は、元の配列$の出現回数を表しS_I $ $ $と仮定

これは、元の問題に変換することができます:$ \ sum_ {i = 1} ^ {2 * N}を満たす、このようなシーケンスの$ bの$を見つける$ bの$は上昇しない、$が最小である{| | S_I-b_iを}

$ N ^ 2 $動的な規制を考えるのは簡単です

提供の$ dp_ {I、J} $は$ I $、$ b_i = j個の$最初の場合の数を考慮する前に最小コストを表します

$ Dp_ {I、J} =分(dp_ {I-1、K})+ ABS(S_I-J)$、$ k個の\のGEQのjは$、次いで配列の最適化をローリング

そんなに思った診察室

$ b_i \当量\ FRAC {2 * N} {I} $:実際には、明白な場所があります

そのような複雑さは$(nlog_2 {N})O $で

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONSTの INT N = 1E6 + 5 int型 [N]、N、S [N << 1 ]。
長い 長い F [ 2 ] [N << 1 ]。
長い 長いANS;
INT のmain()
{ 
    int型のT。
    scanf関数(" %のD "、&T)。
    一方、(T-- 
    { 
        scanf関数(" %のD "、&N)
        以下のためのint型 I = 0; iが<= N << 1 ; ++ I)S [I] = 0 ; 
        ANS = 0 ;
        以下のためにint型 I = 1 ++; iは= N < I)
        { 
            (scanf関数" %のD "、および[I])。
            もし([I]> N << 1)++ ANS。
             ++ の[[I]]; 
        } 
        のためのint型 i = 1 ; iが<= N << 1 ; ++ i)が
        { 
            長い 長いミンクス= 1E16。
            もし(I> 1 のためのINT J =(N << 1)/(I- 1); J>(N << 1)/ I; - j)は
                    ミンクス I-([F =分(ミンクス、1)・1 ] [J])。
            ミンクス= 0 ;
            INT J =(N << 1 ; J> =)/ I 0 - ; J)
                ミンクス =分(ミンクス、[(I-F 1)・1 ] [J])、[I&F 1 [] J] =ミンクス+ ABS(S [i]は- J)。
        } 
        のprintf(" %LLDする\ n "、ANS +分(F [ 0 ] [ 1 ]、F [ 0 ] [ 0 ])); 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/w19567/p/11283264.html