UVA119 Greedy Gift Givers


传送门

这道题可以用模拟来做,不断更新每个人的钱从而求得最后每个人剩的钱,输出即可。

值得注意的是,此题的输出格式判定比较严格。要多注意一些细节。


细节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;
}

文章作者: 王大神——A001
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王大神——A001 !
  目录