[POJ 1873]凸包プラス列挙

まだ繰り広げられている、最初に立っていました

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 ] = 1STA [ 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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/xiaobuxie/p/11570007.html