E1。アリス(簡単バージョン)にボックスを送信

ソリューション:

各1を保存します。次いで総数CNTを記録する。1、各セットがKの倍数であるように、Kがある場合、操作の数を最小限にするために、このCNT kが素因数であるべきです。(必要数が2の一定数よりも小さくなるように回数の変更の各セットは、4を必要とすることセットの数、各セットのそれぞれ)

CNT素因数1-Xコンフィギュレーション即ち新しいコレクション、Xを列挙しました。コンフィギュレーションの新しい設定した場合ときハッシュ(中央値)の中央には2つの側面。残りは暴力です。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
CONST LL INF = 1E18 + 7 CONST N = 1E5 + LL 7 
[N]をARRちゃいます。
ベクトル <LL> VEの。
LL CAL(LL X){ 
    LL和 = 0 
    LL X1 = X / 2 以下のために(iは= LL 0 ; I <ve.size()I + = {x)の
         ための(LL用J = I; J <iは+ X1、J ++ ){ 
            合計 + = Veを[iが+ X1] - [j]をVEの; 
        } 
        のための(LL J = + X-1 ; J> I + X1; j-- ){ 
            合計 + = VEの[J] -ve [I + X1]。
        } 
    } 
    戻り値の和。
} 
ボイド解く(){ 
    LL N。
    cinを >> N; 
    LL CNT = 0 以下のための(iは= LL 1、I <= N; I ++ ){ 
        CIN >> ARR [I]。
        もし(ARR [I]){ 
            CNT ++ 
            ve.push_back(I); 
        } 
    } 
    もし(CNT == 1 || N == 1 ){ 
        COUT<< - 1 << ENDL。
        リターン; 
    } 
    LL M = SQRT(CNT)。
    合計北韓 = INF。
    以下のための(iは= LL 2 ; I <= M; I ++ ){
         場合(CNT%I == 0 ){ 
            合計 = 分(合計、CAL(I))。
            一方(CNT%I == 0 ){ 
                CNT / = I。
            } 
        } 
    } 
    もし(!CNT = 1 ){ 
        合計 = 分(合計、CAL(CNT))。
    }
    coutの <<合計<< てendl;
    リターン; 
} 
int型のmain(){ 
    )(解きます。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Accepting/p/12003080.html