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 。 }