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

31 篇文章 0 订阅

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<string,int>维护每个人最后有多少价值即可。

#include <iostream>
#include <vector>
#include <map>
#include <string>
#define rep(i,j,k) for(i=j;i<k;++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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值