UVa 119|Greedy Gift Givers|STL|map|水题

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=55

题目大意

在这个问题中,有一些要送礼物的好朋友,计算他们给出去的礼物的价值比收到的礼物的价值多多少(如果少的话结果为负数)。
(由于废话太多就翻译到这里了。。)

输入

输入包含多组数据,对于每组数据,第一行一个整数n(n10)表示人的数目。接下来一行n个字符串表示人名。接下来n行每行一开始一个字符串表示本行描述哪个人的信息,后面跟着两个整数,表示其准备送mi(mi2000)价值的东西,要给pi个人,后面跟着pi个人名,表示要均分(整数除法,即每个人m[i] div p[i],剩下的没送出去的留着)送给这些人。
所有的人名都是小数,不会超过12个字符。

输出

对于每组数据,输出n行,每行一个字符串表示人名和一个数字表示这个人最后有多少价值的东西。人名顺序按最开始给人名的顺序排序。
每组数据之间用一个空行隔开。

样例输入

5
dave laura owen vick amr
dave 200 3 laura owen vick
owen 500 1 dave
amr 150 2 vick owen
laura 0 2 amr vick
vick 0 0
3
liz steve dave
liz 30 1 steve
steve 55 2 liz dave
dave 0 2 steve liz

样例输出

dave 302
laura 66
owen -359
vick 141
amr -150
liz -3
steve -24
dave 27

题解

map维护每个人最后有多少价值即可。

#include 
#include 
#include 
#include 
#define rep(i,j,k) for(i=j;i
using namespace std;

int main() {
    int T = 0, n, i, j, money, people;
    string name;
    while (cin >> n) {
        map<string, int> balance;
        vector<string> names;
        rep(i,0,n) {
            cin >> name;
            balance[name] = 0;
            names.push_back(name);
        }
        rep(i,0,n) {
            cin >> name;
            cin >> money >> people;
            if (people == 0)
                continue;
            int gift = money / people;
            balance[name] -= gift * people;
            rep(j,0,people) {
                cin >> name;
                balance[name] += gift;
            }
        }
        if (++T > 1)
            cout << endl;
        rep(i,0,n)
            cout << names[i] << " " << balance[names[i]] << endl;
    }
    return 0;
}

你可能感兴趣的:(UVa,水题)