トピック: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 ; }