2367 - 贪婪的送礼者
时间限制 : 1 秒
内存限制 : 128 MB
对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for those who view gift giving with cynicism)。
在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。
给出一群朋友,没有人的名字会长于14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表,请确定每个人收到的比送出的钱多的数目。
题目输入
|
第 1 行: |
人数NP,2<= NP<=10 |
|
第 2到 NP+1 行: |
这NP个在组里人的名字 一个名字一行 |
|
第NP+2到最后: |
这里的NP段内容是这样组织的: 第二行包含二个数字: 第一个是原有的钱的数目(在0到2000的范围里),第二个NGi是将收到这个送礼者礼物的人的个数 如果 NGi 是非零的, 在下面 NGi 行列出礼物的接受者的名字,一个名字一行。
|
题目输出
输出 NP 行,每行是一个的名字加上空格再加上收到的比送出的钱多的数目。
对于每一个人,他名字的打印顺序应和他在输入的2到NP+1行中输入的顺序相同。所有的送礼的钱都是整数。每个人把相同数目的钱给每位要送礼的朋友,而且尽可能多给,不能给出的钱被送礼者自己保留。
输入/输出样例
输入格式
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
输出格式
dave 302 laura 66 owen -359 vick 141 amr -150
C++解答
#include<iostream> #include<cstring> using namespace std; int n,m,r,x,y,z; string s,name[11]; int pd(); int main() { cin>>n; int a[n+1],b[n+1]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(int i=1;i<=n;i++) { cin>>name[i]; } for(int i=1;i<=n;i++) { cin>>s; m=pd(); cin>>x>>y; a[m]+=x; if(y==0) { b[m]+=x; } else { r=x%y; z=x/y; b[m]+=r; } for(int k=1;k<=y;k++) { cin>>s; b[pd()]+=z; } } for(int i=1;i<=n;i++) { cout<<name[i]<<' '<<b[i]-a[i]<<endl; } return 0; } int pd() { for(int i=1;i<=n;i++) { if(s==name[i]) { return i; } } }