这一题挺简单的,但是如果是纯模拟的话。会十分麻烦

这里介绍一个\(STL\)映射\(map\)

\(map\)的最大优点是可以使用任意数据类型作为数组的下标

\(map\)的定义形式为 map< 下标类型 , 存放的数据类型 > 数组名

如: \(map<string ,int >ans\)

\(map\)的使用方法与普通数组无异

\(map\)数组中值默认为\(0\)

此题所需注意的点

贪婪者送出去的钱是要减去的

x%y&&y!=0 否则会 \(RE\)

#include "bits/stdc++.h"
using namespace std;
int n,num,money;
string name[11];
map<string,int>ans;//map定义
int main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        cin>>name[i];
    for(int i=1;i<=n;i++) {
        string na;
        cin>>na>>money>>num;
        ans[na]-=money;//先减去,反正后面不能分完会加回来
        if(!num) {//特判 被模数
            if(money)
                ans[na]+=money;//如果有钱,收入自己囊中
            continue;
        }
        if(!money)//没钱,免谈!!!
            continue;
        if(money%num)//判断是否有剩余
            ans[na]+=(money%num),money-=(money%num);
        for(int j=1;j<=num;j++)
            cin>>na,ans[na]+=(money/num);//把分出去的钱加上收礼者的数组里
    }
    for(int i=1;i<=n;i++)
        cout<<name[i]<<' '<<ans[name[i]]<<endl;//输出
    return ac;
}

手动防抄袭