USACO SEC.1.1 NO.2 Greedy Gift Givers

题意:给定N个名字, 接下来对于每个名字, 输入给出总钱数, 和人数,以及给到的每个人

最后输出每个人最后的实际获得钱数

题解:映射关系, 例如使用Hash方法或者高速映射方法, C++中可以采用STL的map数据结构

USACO的习题提交格式略麻烦

每次需要修改: 题目名称(头部注释中) 读入输出文件名称(ifstream, ofstream中)

/*
ID: lsswxr1
PROG: gift1
LANG: C++
*/
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <string>
#include <fstream>
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;
}


 

posted on 2013-11-15 17:46  小书包_Ray  阅读(183)  评论(0编辑  收藏  举报

导航