poj3111 Kベストは、2つの点を平均を最大化

トピック:http://poj.org/problem?id=3111

問題の意味:ここでnは、K、V nの番号、Wの値は、kの選択された数、Vの和/ wの和を最大化するようになっています。

アイデア:タイトルを参照するには、これはそれの貪欲な赤い果実ではないでしょうか?トピックに関する理由の二点、しかし... V = 5、W = 10及びv = 1、wは=結果の2効果は同じではありません。

リンクを学習除去:https://blog.csdn.net/karry_zzj/article/details/70232097

コードを接続します。

書式#include <アルゴリズム> 
書式#include <stdio.hに> 
する#include <iostreamの>
 使用して 名前空間はstdを、
const  int型 MAXN = 1E6 + 10 int型N、K。
構造体のノード
{
    int型のID。
    ダブルV、W、Y。
} P [MAXN]。
ブールCMP(ノードA、ノードB)
{
    戻る > AY によって;
}
ブールチェック(ダブル中旬)
{
    ダブル TMP = 0 ;
    以下のためにint型 i = 1 ; iが<= N; iは++)P [i]は.Y = P [I] .V-MID *のP [I] .W。
    ソート(P + 1、P + 1 + N、CMP)。
    以下のためにint型 i = 1 ; iが= Kを<; iは++します
    {
        TMP + = P [i]は.Y。
    }
    リターン TMP> = 0 ;
}
int型のmain()
{
    scanf関数(" %d個の%のD "、&​​N&K)。
    以下のためにint型 i = 1 ; iが<= N; iは++)scanf関数を(" %のLFの%のLF "、&​​P [I] .V、&Pを[I] .W)、P [i]は.ID = I。
    ダブル L = 0、R = 1E7、ANS = 0 一方、(RL> 1E- 8 
    {
        二重半ば=(L + R)/ 2 もし(チェック(MID))L = ミッド。
        他の R = ミッド;
    }
    以下のためにint型 i = 1 ; iが= Kを<; iは++します
    {
        もし(I == K)のprintf(" %d個の\ n " 、P [I] .ID)。
        のprintf(" %d個" 、P [i]の.ID)。
    }
    リターン 0 ;
} 

 

おすすめ

転載: www.cnblogs.com/myrtle/p/11784366.html
おすすめ