羅区p1080キングスゲーム(精度+貪欲)

タイトル説明

一致する  H Hナショナルデー、王は招待n個の賞でゲームをプレイするためにnビットの大臣。まず、彼はそれぞれの上部の左右の手の各大臣は自身がそれぞれ右手の整数を書くために、残された整数王を書いてみましょう。その後、聞かせて  N- 行のn大臣を、王は前のランクに立ちました。並ん後、すべての閣僚は、金貨王の報酬の数を受け取る、各大臣のためのコインの数が得られた:彼の右手に数で割った数のすべての大臣の前で左手上の行の製品、結果は、整数取得を切り捨てています。

王は大臣が特に大きな賞を取得する必要はありませんので、彼はそのほとんどの報酬大臣を取得するために、彼はチームの順番を並べ替える助けをお願いしたいと思い、できるだけ少ない報酬を受け取りました。王の位置は常に前のランクになっていることに注意してください。

入力形式

最初の行は、整数に含まN- 、N-を大臣の数を表します。

2行目は、二つの整数含ま  Aと  B との間の空間によって分離されたB、それぞれが王の左右の整数を表します。

次いで、  N- 、N行、二つの整数含む各行A A及び  B それぞれとの間の空間によって分離されたBは、それぞれ左右の整数大臣を表します。

出力フォーマット

金貨大臣のほとんどの数で再配置されたツアーを獲得した後、チームを表す整数が得られます。

サンプル入力と出力

エントリー
3 
1 1 
2 3 
7 4 
4 6
輸出 
2 

貪欲証明:王は王、P1大臣、P2でみましょう。
キングキングL0 L0、R0の可算R0

   P1 P2 L1 L2 R1 R2
   P2 L1 L2 R1 R2 P1は

、K1 = L0 / R1、K2 =である L0 *、L1 / R2、K3 = L0 / R2、K4 = L0 * L2 / R1。
ANS1 = MAX(K1、K2) 、ANS2 = MAX(K3、K4);
明らかにK2> K3、K4> K1、もしそうであればANS1> ANS2、K2> K4、すなわちL1 * R1> I2の* r2と;
従ってソート* bを押すと、優先順位が可能です。

(精密オペアンプ基板として、これ以上の説明)
書式#include <iostreamの> 
の#include <CStringの> 
の#include < 文字列 > 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <スタック> 
書式#include <stdio.hに> 
する#include <cmath> 
の#include < 文字列の.h> 含める <ベクトル> の#define LL長い長い
 使って名前空間はstdを、int型 N、レンズ= 1、lenm = 1、リナ= 1 INTの和[ 10010 ] = { 01

 

}、MAXN [ 10010 ] = { 01 }、ANS [ 10010 ]; 

構造体{の
    LLのL、R&LT; 
    BOOL  演算子 <(CONST Xの)CONST 
    { 
        リターンのL * R&LT <XL * XRは;      // プレス硬貨が左右しました優先順位付けの積
    } 
} COIN【1001 ;] 

無効時間(X LL)     // 精度乗算
{
     INT T = 0 ;
     のためのINT I = 1 ;私は=レンズ<; Iは++ 
        SUM [I] * =バツ;
    以下のためにint型 i = 1 ; iが=レンズを<Iは++ 
    { 
        T + = 合計は[i]は、
        和[I]のT%= 10 
        T / = 10 
    } 
    一方、(T!= 0 
    { 
        レンズ ++ 
        和[レンズ] = Tの%10 
        T / = 10 
    } 
} 

ボイド DIV(LL X)          // 高精度除法
{ 
    memsetの(ANS、0はsizeof (ANS))。
    レナ = レンズ。
    int型、T = 0 ;
    以下のためにint型 I =レンズ; I> = 1 ; i-- 
    { 
        T * = 10 
        T + = 和[I]。
        もし(T> = X)
        { 
            ANS [I] = T / X。
            Tの%= X。
        } 
    } 
    一方(ANS [レナ] == 0 
    { 
        場合(レナ== 1破ります; 
        レナ - ; 
    } 
} 

ボイド MAX()         // 高精度比较
{
     場合(レナ> lenm)
    { 
        ためint型 I = 1 ; I <=レナ; iは++ 
            MAXN [I] =のANS [I]。
        lenm = レナ。
    } 
    そう であれば(レナ== lenm)
    { 
        ためINT I =レナ; I> = 1 ; i-- 場合(MAXN [I] <ANS [I])
            { 
                ためINT J = 1、J <=レナ; J ++ 
                    MAXN [J] =のANS [J]。
                lenm = レナ。
                破ります; 
            } 
    } 
} 

int型のmain()
{ 
    IOS :: sync_with_stdio()。
    cinを >> N; 
    CIN >>コイン[ 0 ] .L >>コイン[ 0 ] .R。
    以下のためにint型 I = 1 iは= N <; I ++ 
        CIN>>コイン[I] .L >> コイン[I] .R。
    ソート(コイン + 1、コイン+ N + 1 )。
    以下のためにint型 i = 1 ; iが<= N; iは++ 
    { 
        回(コイン[I - 1 ] .L)。
        DIV(コイン[I] .R)。
        MAX(); 
    } 
    のためにint型 I = lenm; I> = 1 ; i-- 
        COUT << MAXN [I]。
    リターン 0 ; 
}

 



おすすめ

転載: www.cnblogs.com/zxybdnb/p/11443962.html