トピックリンクします。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 ; }