--POJ3111を計画して01得点

トピックリンク

タイトルの意味

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 ; 
}

 

おすすめ

転載: www.cnblogs.com/helman/p/11332076.html