AOJ - Problem 2198 : Moonlight Farm


入力が多いので面倒ですが落ち着いて考えるとそんなに難しくありません。
L:作物の名前
P:作物の値段
A:種から芽が出るまでの時間
B:芽が出てから若葉が出るまでの時間
C:若葉が出てから葉が茂るまでの時間
D:葉が茂ってから花が咲くまでの時間
E:花が咲いてから実が実るまでの時間
F:実1個当たりの種の数
S:種1個当たりの価格


(全ての実が成り終わるまでの時間)=(A+B+C)+(D+E)*M
(収入)=F*S*M - P
(収入効率)=(収入)÷(全ての実が成り終わるまでの時間)
で計算できます。

あとは収入効率の降順にソートするだけです。収入効率が同じときは作物の名前(文字列)の辞書順(昇順)にします。普通にsort関数を使うと収入効率も文字列も昇順になってしまうので収入効率を負数にしました。(-1をかける)

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;

typedef pair<double,string> P;

int main(){
	int n;
	while( cin >> n , n ){
		vector<P> vc;
		for(int i=0 ; i < n ; i++ ){
			int p,a,b,c,d,e,f,s,m;
			string l;
			cin >> l >> p >> a >> b >> c >> d >> e >> f >> s >> m;
			double E = -(double)( f*s*m - p ) / ( (a+b+c) + (d+e)*m );
			P p_( E , l );
			vc.push_back( p_ );
		}
		sort( vc.begin() , vc.end() );
		for(int i=0 ; i < vc.size() ; i++ ){
			cout << vc[i].second << endl;
		}
		cout << "#" << endl;
	}
}