这道题可以用模拟来做,不断更新每个人的钱从而求得最后每个人剩的钱,输出即可。
值得注意的是,此题的输出格式判定比较严格。要多注意一些细节。
细节1
每个给钱人都会将尽可能多的钱给出去,但只会给出整数,而剩下无法在平均分的钱会留在自己手中。
细节2
有可能会出现有人想把钱分给零个人的情况,所以要特判一下,不能将零作为除数。
细节3
每个组的输出应该用空行与其他组分开。这个说明在样例中没有体现,必须要注意一下,这道题的格式要求严格。
如果是在每组结束后再输出一个换行来满足说明,那最后结束的时候会有换两行,不符合格式会判错。代码中有这个问题的解决方法。这个问题的出现是因为,本该要再读入下一组数据,但此时已经没有数据了,所以程序终止,却保留了要读入的空行。
代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int n;//n个人
string n_n[11];//n个名字
long long m_m[11];//每个人有的钱
string n_a;//花钱的那个人
int s_m,s_n;//花钱的数值,分给几个人
int t_m;//每个人被分给钱的数值
string g_n;//每次被分给钱的人的名字
map<string ,int>mp;//存人的钱
bool b_b=0;
int main(){
while(cin>>n){
if(b_b)cout<<endl;b_b=1;//格式问题,规范输出
for(int i=0;i<n;i++)cin>>n_n[i];//读入人名,也同样是输出顺序
for(int i=0;i<n;i++){
cin>>n_a>>s_m>>s_n;
if(!s_n)continue;//不能除零
t_m=s_m/s_n;
mp[n_a]-=t_m*s_n;//减去分出钱的数量
for(int i=0;i<s_n;i++){
cin>>g_n;
mp[g_n]+=t_m;//得到钱的人要加上
}
}
for(int i=0;i<n;i++){
cout<<n_n[i]<<" "<<mp[n_n[i]]<<endl;
mp[n_n[i]]=0;//多测清空
}
}
return 0;
}