トピックへのリンク:https://ac.nowcoder.com/acm/contest/889/D
タイトル効果:これらの数字の合計がSに等しくなるように、n個からいくつかの番号を見つけるためには、答えは「01」の文字列で表示します
レポートの問題解決: N数を2つの部分に分割され、その後、バイナリビットを列挙し、$ 2 ^ {\ FRAC {Nの合計の前部 } {2}} $ ,,種の可能なケースと、それぞれの場合に、wはあります和の後半には、$ SW $事情を見つける二つの部分をマージする答えです。
ACコード:
1の#include <ビット/ STDC ++。H> 2 の#define numm CH-48 3 の#defineのPdのputchar( ' ') 4 の#defineのPNのputchar('の\ n') 5 の#define PB一back 6 の#define Fiの第 7 の#define SE第 8 の#define FRE1 freopenは( "1.TXT"、 "R"、STDIN) 9 の#define fre2 freopenは( "2.txt"、 "W"、STDOUT) 10 の#defineデバッグCOUT << "デバッグ" << ENDL 11を 使用して 名前空間はstdを、 12テンプレート<型名T> RES){ 14 ブールフラグ= 偽。char型のCH; 15 一方(isdigit(CH = GETCHAR())!)(CH == ' - ')&&(フラグ= 真)。 16 のために(RES = numm; isdigit(CH = GETCHAR()); RESの=(RES << 1)+(RES << 3)+ numm)。 17 フラグ&&(RESの= - RES)。 18 } 19テンプレート<型名T> 20 ボイドライト(T X){ 21 であれば(X < 0)のputchar(' - ')、X = - X。 22 であれば(X> 9)書き込み(X / 10 )。 23 のputchar(Xの%10 + ' 0 ' )。 24 } 25のtypedef 長い 長LL。 26 のconst int型 MAXN = 40 。 27 のconst int型 MAXM = 505 ; 28 のconst int型 MOD = 1E9 + 7 。 29 のconst int型 INV2 = 500000004 ; 30 構造体ノード{ 31 ; V、W LL 32 LLビット。 33 } wtz [ 1 <<(MAXN >> 1 )]。 34 LLのN、S。 35 LL [MAXN]。 36 37 ブール CMP(ノードと、ノード&B){ 38 リターン AW < BW。 39 } 40 INTは(見出さint型 L、int型のR、LLのX){ 41 INTミッド= 0 。 42 一方(L < R){ 43 半ば=(L + R)>> 1 。 44 であれば(wtz [中間] .W == X)戻る途中に、 45 他の 場合(wtz [中間] .W <X)L =ミッド+ 1 。 46 他の 場合(wtz [中間] .W> X)R = ミッド。 47 } 48台の リターン半ば; 49 } 50 ボイドプリント(int型のx、int型LEN){ 51 CHAR S [ 1 <<(MAXN >> 1 )]。 52 のために(int型 I = 0 ; iがLEN <I ++は{) 53の S [I] = X%2 。 54 X / =2 ; 55 } 56 のために(INT I = len- 1 ; I; i-- ) 57 ライト(S [I])。 58 } 59 ボイドが解決(){ 60 のLL N2 = N / 2 。 61 のためには、(int型 iは= 0 ; iは< 1 << N2; iは++ ){ 62 のLL SW = 0 。 63 のために(INT J = 0 ; J <N2; J ++ ) 64 であれば(I >> J&1 ) 65 SW + = A [J]。 66 wtz [I] .W = SW。 67 wtz [I]のBIT = I。 68 } 69 70 ソート(wtz、wtz +(1つの << N 2)、CMP)。 71 72 のために(int型 i = 0 ; iは< 1 <<(N-N2); iは++ ){ 73 のLL SW = 0 。 74 のために(INT J = 0 ; J <N-N2; J ++ ) 75 であれば(I >> J&1 ) 76 SW + = [N 2 +のJ]。 77 であれば(SW <= S){ 78 // デバッグ。 79 見出さLLのPOS =(0、(1つの << N 2)、S- SW)。 80 // COUT << wtz [POS] .W << ENDL。 81 であれば(wtz [POS] .W + SW == S){ 82 INT S [ 40 ]。 83 のための(int型のk = 0 kは++; N <K ) 84の S [K] = 0 ; 85 のための(int型 K =0 ; K <N2; ++ k個){ 86 であれば((wtz [POS]のBIT >> K&1 )) 87の S [K] = 1 。 88 } 89 のために(INT K = 0、K <N-N2あり、k ++ ){ 90 であれば(I >> K&1 ) 91の S [N 2 + K] = 1 。 92 } 93 のための(int型のk = 0 kは++; N <K ) 94 ライト(S [K])。 95 PN; 96 リターン; 97 } 98 } 99 } 100 } 101 INT メイン() 102 { 103 // の#defineローカル 104 ローカルの#ifdef 105 FRE1。 106 // fre2。 107 #endifの // ローカル 108 リード(N)、(S)読み取ります。 109 のためには、(int型 i = 0 ; iがn <; iは++ ) 110 リード([I])。 111 解決する(); 112 戻り 0 ; 113 }