まだ繰り広げられている、最初に立っていました
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 のconst int型 N = 20 。 4つ の#define EPS 1E-8 5 の#define INF 0x3f3f3f3f 6 INT SGN(ダブルX){ 7 場合(ファブ(X)<EPS)戻り 0 ; 8 場合(X < 0)リターン - 1 。 9 リターン 1 。 10 } 11 構造体のポイント{ 12 ダブルX、Y、L。 13 INT V; 14 ポイント演算子 - (CONSTポイント&B)のconst { 15 リターン(ポイント){xb.x、Y- によって}。 16 } 17 ダブル 演算子 ^(CONSTポイント&B)のconst { 18 リターン X *で-BX *のY。 19 } 20 } P [N]、[N]、P0。 21 INTのSTA [N]。 22 INT N。 23 BOOL VIS [N]。 24 ダブルDIST(点B、点){ 25 リターン SQRT((AX-BX)*(AX-BX)+(AY-によって)*(ay- )によります)。 26 } 27 ブールCMP(A点、B点){ 28 であれば(ATAN2(AY-p0.y、AX-P0.X)!= ATAN2(bx--p0.yによってP0.X)){ 29 リターン(ATAN2(AY-p0.y、AX-P0.X)<ATAN2(バイp0.y、bx- P0.X))。 30 } 31 リターン AX < BX。 32 } 33 ダブルグラハム(int型CNT){ 34 であれば(CNT < 2)戻り 0 ; 35 もし(CNT == 2)リターン DIST([ 1 ]、[ 2 ])。 36 P0 = [ 1 ]。 37 のint = K 1 。 38 のためには、(int型、I = 2、iは<= CNTを; ++ I){ 39 であれば((p0.y> [I] .Y)||(p0.y == [I] .Y && P0。 X> [I] .X)){ 40 、P0 = [I]。 41 K = I。 42 } 43 } 44 [k]は= [ 1 ]。 45 [1 ] = P0。 46 ソート(+ 2、A + 1本の + CNT、CMP)。 47 STA [ 0 ] = 1。STA [ 1 ] = 2 ; 48 int型のトップ= 1 。 49 のために(int型 I = 3 ; iが<; ++ = N I){ 50 ながら(TOP> 0 &&(([I] -a [STA [トップ1 ])^([STA [トップ] ] -a [STA [トップ1 ]))<= 0) - トップ。 51 STA [++トップ] = I。 52 } 53 二重のANS = 0 。 54 のために(int型 I = 0 ; iがトップ<; ++ I)ANS + = DIST([STA [I]、[STA [I + 1 ])。 55の ANS + = DIST([STA [ 0 ]]、[STA [トップ])。 56の リターンANS。 57 } 58 INT ANS [N]。 59 INT メイン(){ 60 INT N。 61 int型 CAS = 0 。 62 一方(〜のscanf(" %d個"、&N)&& N){ 63 用(int型 iは= 0のscanf(iは++; iがN <)" %LF%LF%D%LF " .V [I] [I]・Y、&Pを.X、&P [i]は、&P&P [i]は.L)。 64 INT ansv = INF、ANSN = INF、anslef。 65 のために(int型 I = 0 ; iが(< 1 << N); ++ I){ 66 のmemset(VIS、0、はsizeof (VIS))。 67 INT temv = 0、temn = 0 ; 68 二重 teml = 0 。 69 int型 CNT = 0 ; 70 のための(int型 J = 0 ; nはJ <; ++ J){ 71 であれば((1 << J)&I){ 72 VIS [J] = 1 。 73 ++ temn。 74 temv + = P [J] .V。 75 teml + = P [J] .L。 76 } 77 他 [++ CNT] = P [J]。 78 } 79 であれば(temv> ansv ||(temv == ansv && temn> ANSN))続けます。 80 ダブル使用= グラハム(CNT)。 81 であれば(使用<= {teml) 82 ansv = temv。 83 anslef = teml- 使用。 84 ANSN = 0 。 85 のために(INT U = 1 ++ uと; Uは<= n)の場合(VIS [U])を[++ ANSN] = ANS Uと、 86 } 87 } 88 のprintf(" フォレスト%Dを\ n "、++ CAS)。 89 のprintf(" これらの木をカット:" ); 90 のためには、(int型 I = 1 ; I <= ANSN; ++ I)のprintf(" %dの" 、ANS [I])。 91 のprintf(" の\ n " ); 92 のprintf(" エクストラ木:%.2lf \ N " 、ansv)。 93の プット("" ); 94 } 95 }