サマースクールキャンプ(第2フィールド)オフ以上2019頭の牛-F artition問題

トピックリンクします。https://ac.nowcoder.com/acm/contest/882/F

問題の意味:競争力の値と別のグループ所有者とグループ所有者を求めているn個の個人の二つのグループに2×n個の個人。

アイデア:

  T、結果は、WA自閉症されたときに提出されるだろう人の各グループの競争力の価値を追求し、2時間のために書くゲーム、の間違ったタイトル。

  読んタイトルの後、T.を開始しました

  N <= 14、検索+プルーニングを使用することで行うことができます。C(2 * N、N)複雑さが、各々がO(N×n個)の複雑な結果を必要とするが算出される検索は、総複雑性はO(N * N * C(2 * N、N))であるました確かに意志T.

  最適化:簡素化演算結果、第1の予備処理各行およびv2、他の全てのベクトルメモリが選択されていたように、個々の人々のためのi番目すなわち競合値V2 [i]は、個体はで、次のx時間を​​選択します前Iを添加する時間がないので、V2 [i]が(すべてのV1が[X] [i])と、iは、人々の数は、ハエから選択された2×を減算することにより、2で保存します。そのような複雑さはO(N * C(2 * N、N))に還元され、それがオフになっている、4Sとして標題。

     また、最初の直接選出された個人は、個人は確かに、このように選挙結果は、1倍の複雑さを軽減することができ、チームであることが最初ですので。

 ACコード:

書式#include <cstdioを> 
する#include <アルゴリズム> 
書式#include <ベクトル>
 使用して 名前空間はstdを、

typedefの長い 長いLL。
int型のn; 
LL v1の[ 30 ] [ 30 ]、V2 [ 30 ]、ANS。
ベクトル < int型 > VC; 

ボイド DFS(INTのX、LLの合計){
     場合(vc.size()== N){
         場合(和> ANS)ANS = 和。
        返します
    } 
    場合(X> 2 * n)の戻り ;
    LL TMP = V2 [X]。
    int型 iは= 0 ; iが(vc.sizeを<); ++ I)
        TMP - = 2 *のV1 [X] [VC [i]は]。
    vc.push_back(X)。
    DFS(X + 1、和+ TMP)。
    vc.pop_back(); 
    DFS(X + 1 、合計)。
} 

int型のmain(){ 
    scanf関数(" %のD "、&N)
    以下のためにint型 i = 1 ; iは= < 2 ++; * N I)
         のためにINT J = 1 ; J <= 2 * N; ++ j)は
            scanf関数(" %のLLD "、&​​V1 [i]は[J])、V2 [I] + = V1 [i]は[J]。
    vc.push_back(1 )。
    DFS(2、V2 [ 1 ])。
    printf(" %LLDする\ n " 、ANS)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11221767.html