備忘録

まとめておきたいことのメモ 主にプロコンのこと

AOJ-ICPC 2198

Moonlight Farm | Aizu Online Judge

作物の収入効率を調べる問題。
収入効率は以下の式で表されます。

収入効率
  = ((その種から成った全ての実を売った金額) - (種の値段)) / (種を植えてから全ての身が実り終わるまでの時間)

牧場物語でこういう状況に慣れているので問題の把握はとても簡単でした。
以下答え。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <ctype.h>
#include <string> 
#include <sstream>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <queue>
#include <utility>
#include <vector>
#include <set>
  
using namespace std;
 
int main()
{
    int N;
    while(1){
        cin >> N;
        if(N == 0) break;
        vector<pair<double, string> > name_efficiency(50);
        string l[50];
        int p[50], a[50], b[50], c[50], d[50], e[50], f[50], s[50], m[50];
        int income[50] = {0}, how_long[50] = {0};
        for(int i = 0; i < N; i++){
            cin >> name_efficiency[i].second >> p[i] >> a[i] >> b[i] >> c[i] >> d[i] >> e[i] >> f[i] >> s[i] >> m[i];
            income[i] -= p[i];
            how_long[i] += a[i] + b[i] + c[i] + d[i] + e[i];
            income[i] += f[i] * s[i];
            m[i]--;
            while(m[i] > 0){
                how_long[i] += d[i] + e[i];
                income[i] += f[i] * s[i];
                m[i]--;
            }
            double efficiency = (double) income[i] / how_long[i];
            name_efficiency[i].first = - efficiency;
        }
        sort(name_efficiency.begin(), name_efficiency.begin() + N);
        for(int i = 0; i < N; i++){
            cout << name_efficiency[i].second << endl;
        }
        cout << "#" << endl;
    }
    return 0;
}

作物の名前と収入効率をpairを用いてname_efficiency(ただしfirstが収入効率、secondが名前。このへんミスった)に記録。
その後、それぞれの収入incomeと総時間how_longを計算していきます。
まずincomeから種の値段を引き、一回目にできた作物の収入を加え、how_longに種を植えてから実が成るまでの時間を加えます。それから全ての実が実り終わるまで、つまりmが0になるまで収入と時間を加えます。
最後に上式に当てはめ収入効率を計算。pairでの並び替えは小さいもの順になるのでマイナスをつけることによって大きいもの順に並び変わるようにします。sortを用いれば名前も勝手に辞書順になるので便利!


最初は収入効率もint型にしていたので計算が合わなくてあれーってなった。
ゲームのイメージがあったからむだにループを回してしまったけどそんな必要はなかったなあ。
あともしかしたらmapを使ってもよかったかもしれませんね。