タイトルの意味
k個のダイヤモンド、例えばsigmaVi / sigmaWi最大値を検索し、次にこれらのダイヤモンドの数を出力します
トピック分析
Ruoshi sigmaVi / sigmaWiは最大値を取得するので、任意のk個のダイヤモンド回答ANSを取ります
ANS <= sigmaVi / sigmaWi
変換sigmaVi-sigmaWi何ですか* ANS> = 0
そして、シグマあるものに変換(VI-のWi * ANS)> = 0
彼らは上記の式に低い=半ばを満たしている場合、ANSは、ジエチルポイントが付属しています
それ以外の場合は、高い=ミッド
出力番号、構造I及びベクトル・ストアと各進数
トピックコード
大きな半分の上限はオープンに注意してください
する#include <stdio.hに> する#include <iostreamの> する#include < 文字列・H> の#include <アルゴリズム> の#include <ベクトル> 使用して 名前空間STD。 const int型 MAXN = 1E5 + 7 。 constの ダブル EPS = 1E- 7 。 構造体ノード{ int型のID。 ダブルV、ヴァル、ワット。 }ノード[MAXN]。 ブールCMP(ノード、ノードB){ 戻り a.val> b.val。 } int型N、K。 ダブルR、L、ミッド、合計。 ベクトル <int型 > V。 INT メイン(){ scanf関数(" %d個の%のD "、&N&K)。 L = 0.0 ; R = 3000 。 以下のために(int型私= 1 ; iが<= N; iが++ ){ scanf関数(" %のLFの%のLF "、およびノード[I] .V、およびノード[I] .W)。 ノード[i]は.ID = iは、 R = MAX(R、ノード[i]は.V / ノード[I] .W)。 } 一方(RL> EPS){ 半ば =(L + R)/ 2 。 以下のための(int型 I = 1 iが<= N; iが++ ) ノード[i]は.val =ノード[I] .Vノード[I] .W * ミッド。 合計 = 0 ; v.clear(); ソート(ノード + 1、ノード+ 1 + N、CMP)。 以下のために(int型 i = 1 ; iは= Kを<I ++は{) 合計 + = ノードを[I] .val。 v.push_back(ノード[I] .ID)。 } であれば(和> = 0)、L = ミッド。 他の R = ミッド; } // ソート(v.begin()、v.end()); 用(int型 I = 0 ; iがv.size()<I ++のを){ 場合(!I)のprintf(" %dの" 、V [I])。 他のprintf(" %d個" 、V [i])と、 } のprintf(" の\ n " ); リターン 0 ; }