質問の意味:
各項目は、彼のガールフレンドを幸せにするために一定の確率を持っている多くの項目があります。あなたは一度だけのガールフレンドが幸せと幸せしたいので、あなたは、いくつかの項目を選ぶ最大の確率度だけ幸せにこれを行う、最大の確率を見つけます。
ソリューション:
$ P_I $の彼のガールフレンド幸せな私の確率を作るために設定された項目
あなたはK 1-k個の項目の合計を拾う場合は、ガールフレンドを思い出すことができます$一度正確に幸せ確率$ W_0 = \ PROD _ {i = 1} ^ K(1-P_I)$のガールフレンドの確率ではありませんW_1 = C_k ^ 1つの\和_ {i = 1} ^ k個の\ FRAC {W * P_I} {1-P_I} $
もしK + 1番目のピックアイテム、正確$ W ^、= W_0 * p_k + W_1 *(1-p_k)$の幸せなガールフレンド確率
貪欲な性質を選択します。式で見られ、選択された最初のk個の記事がどんなにそれが最適な選択はならないのk + 1番目の項目、その後、最適な解決策ではない場合。
最適な基礎構造プロパティ:まだ式で見た、最適なソリューションは、最も可能性の高いアイテムが含まれている必要があります。
従って降順にソートし、貪欲上記の式を用いて計算することができます。
書式#include <iostreamの> の#include <cmath> の#include <アルゴリズム> 使用して 名前空間はstdを、 ダブル [ 100005 ]。 // INT MAIN1(){ // INT N。 // 一方、(1){ // のscanf( "%d個"、&N); // ダブルFRAC = 1; // ダブルのANS = 0; // ため(; iがn = <; I = 1 int型私は++){ // のscanf( "%のLF"、および[I])。 // FRAC * =(1- [I])。 // } // {ため(iは++; iがn = <I = 1 INT) // ANS + =(FRAC /(1- [I]))* [I]。 // } // のprintf( "%のFを\ n"、ANS)。 // } // // // } int型のmain(){ int型のT。 scanf関数(" %のD "、&T)。 一方、(t-- ){ int型N。 scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが++; iが<= N ){ scanf関数(" %のLF "、& [I])。 } ソート(A + 1、A + 1個の + N)。 ダブル POW = 1 ; ダブルのANS = 0 ; ダブル MAXX = 0 ; 以下のために(int型 I = N; I> = 1 ; i-- ){ ダブル今= [I] * POW +(1 -a [I])* ANS。 // printfの( "%LFの\ nを"、今)。 ANS = 今; MAXX = MAX(MAXX、今)。 POW * =(1 -[I])。 } のprintf(" %.8fする\ n " 、MAXX)。 } 戻り 0 。 }