USACO SEC.1.1 NO.2 Greedy Gift Givers

6524 ワード

題意:N個の名前を与えて、次に各名前に対して、総金額と人数を入力して、そして与えた一人一人に与える
最後に一人一人の最後の実際の獲得金額を出力します
問題解:マッピング関係、例えばHash方法あるいは高速マッピング方法を使用して、C++の中でSTLのmapデータ構造を採用することができる
USACOの練習問題の提出フォーマットは少し面倒です
毎回変更する必要があります:タイトル名(ヘッダーコメント)出力ファイル名(ifstream,ofstream)を読み込みます.
/*
ID: lsswxr1
PROG: gift1
LANG: C++
*/
#include 
#include 
#include 
#include 
#include <set>
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include <string>
#include 
using namespace std;

///   
const int  INF = 1000000000;
const int MAXN = 1010;
const int maxn = MAXN;
///         

#define USACO

#ifdef USACO
#define cin fin
#define cout fout
#endif
//
int np;
map<string, int> receiveMoney;
map<string, int> sendoutMoney;
string names[maxn];
int main()
{

    
#ifdef USACO
    ofstream fout ("gift1.out");
    ifstream fin ("gift1.in");
#endif
    //
    ///    
    receiveMoney.clear();
    sendoutMoney.clear();
    cin >> np;
    for (int i = 0; i < np; i++)
    {
        string tmp;
        cin >> tmp;
        names[i] = tmp;
        receiveMoney[tmp] = 0;
        sendoutMoney[tmp] = 0;
    }
    string senderName;
    while (cin >> senderName)
    {
        int originMoney, persons;
        cin >> originMoney >> persons;
        if (persons == 0)
            continue;
        int ave = originMoney / persons;
        for (int i = 0; i < persons; i++)
        {
            string recName;
            cin >> recName;
            receiveMoney[recName] += ave;
            sendoutMoney[senderName] += ave;
        }
    }

    for (int i = 0; i < np; i++)
    {
        cout << names[i] << " " << receiveMoney[names[i]] - sendoutMoney[names[i]] << endl;
    }


    ///  
    return 0;
}

 
転載先:https://www.cnblogs.com/rayforsure/p/3425849.html