リトル祖Chongzhiの三角形
制限時間:1000分の2000 MS(Javaの/その他)メモリの制限:512000分の512000 K(Javaの/その他)
の合計提出(S):2969受理提出(S):1633
問題の説明
祖Chongzhi(429から500)は、劉の歌と南チー王朝の間に著名な中国の数学者や天文学者でした。祖は、小数点以下6桁の精度と千年のofπ値を計算し、その後、後続の数学者が、これは正確な値を計算しません。祖は、我々が今日知っているよう365.24219878日に非常に近い365.24281481日、として1年間計算します。彼はまた、球の体積の公式を導き出すに取り組みました。
祖は小さな男の子だったとき、彼は数学的なゲームを気に入って、いくつかの伝説物語の本の中で述べています。ある日、彼の父親は彼におもちゃのようないくつかの木の棒を与えました。祖Chongzhiは、それらを使用して、興味深い問題を発見しました。彼はそれらの棒でいくつかの三角形を作りたかった、と彼は彼ができるだけ大きくなるように作られたすべての三角形の総面積を望んでいました。ルールは以下の通りでした。
1)三角形は、3本の棒で構成できました。
2)三角形の頂点は、スティックの端の点でなければなりません。三角形の頂点は、スティックの真ん中にすることができませんでした。
3)祖は、すべてのスティックを使用する必要はありませんでした。
それは、アルゴリズムの問題ではなく、数学の問題だったので、残念ながら、祖はその問題を解決していませんでした。あまりにも多くの棒がある場合は、コンピュータなしでその問題を解決することはできません。だからあなたのコンピュータを持参してください、多分あなたは歴史を変えることができるように彼を助けるために戻っ祖の時間に行きます。
祖は小さな男の子だったとき、彼は数学的なゲームを気に入って、いくつかの伝説物語の本の中で述べています。ある日、彼の父親は彼におもちゃのようないくつかの木の棒を与えました。祖Chongzhiは、それらを使用して、興味深い問題を発見しました。彼はそれらの棒でいくつかの三角形を作りたかった、と彼は彼ができるだけ大きくなるように作られたすべての三角形の総面積を望んでいました。ルールは以下の通りでした。
1)三角形は、3本の棒で構成できました。
2)三角形の頂点は、スティックの端の点でなければなりません。三角形の頂点は、スティックの真ん中にすることができませんでした。
3)祖は、すべてのスティックを使用する必要はありませんでした。
それは、アルゴリズムの問題ではなく、数学の問題だったので、残念ながら、祖はその問題を解決していませんでした。あまりにも多くの棒がある場合は、コンピュータなしでその問題を解決することはできません。だからあなたのコンピュータを持参してください、多分あなたは歴史を変えることができるように彼を助けるために戻っ祖の時間に行きます。
入力
10以下のテストケースはありません。それぞれの場合について:
最初の行祖Chongzhiが持っていた棒の数を示す整数N(3 <= N <= 12)です。2行目はNスティックの長さを意味し、N個の整数を含みます。スティックの長さはこれ以上100より入力= 0 Nで終了します。
最初の行祖Chongzhiが持っていた棒の数を示す整数N(3 <= N <= 12)です。2行目はNスティックの長さを意味し、N個の整数を含みます。スティックの長さはこれ以上100より入力= 0 Nで終了します。
出力
各テストケースのために、出力三角形祖の最大総面積は作ることができます。小数点以下2桁まで結果をラウンド。祖は、任意の三角形を作ることができなかった場合は、0.00を印刷します。
サンプル入力
3 1 1 20 7 3 4 5 3 4 5 90 0
サンプル出力
0.00 13.64
問題の意味:スティックの長さは数、三角形の最大面積の全てを形成することができ、需要与えられています。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 const int型 MAXN = 1E5 + 10 。 構造体三角形{ LLのID; ダブルエリア; }。 int型のn; ベクトル <三角> V。 INT [MAXN] C。 ダブル DP [MAXN * 100 ]; INT メイン(){ ながら(〜のscanf(" %d個"、&N)&& N){ ため(登録をint i = 1 ; iが<= N; ++I){ scanf関数(" %のD "、C + I)。 } ソート(C + 1、C + 1個の + N)。 v.clear(); 用(登録をint i = 1 ; iが<= N ++ {I) のために(登録INT J = I + 1、J <= N; ++ J){ 用レジスタ(INT K = J + 1 ; <= N k個; ++ K){ もし、(C [K] <C [I] + C [J] && C [J] -c [I] < C [K]){ ダブル P =0.5 *(C [I] + C [J] + C [K])。 LL POS =(1 << I)|(1 << J)|(1 << k)は、 二重面積= SQRT(P×(PC [I])*(PC [J])*(PC [K]))。 v.emplace_back(三角形{POS、エリア})。 } } } } ため(登録をint i = 1 ; iが<(1 <<(N + 1 ;))++ {i)は DP [I] = 0 ; } ため(登録intです i = 1 ; iは<(1 <<(N + 1)); ++ I){ ため(登録INT J = 0 ; J <v.size(); ++ J){ int型の POS = V [J] .ID; もし((I&POS)== 0 ){ DP [I | POS] = MAX(DP [I | POS]、DP [I] + V [J] .area)。 } } } ダブル ANS = 0.0 。 ため(登録をint = I 1 ; iは<(1 <<(N + 1)); ++ I){ ANS = MAX(ANS、DP [I])。 } のprintf(" %.2lfする\ n " 、ANS)。 } 戻り 0 。 }