Greedy Gift Givers

貪婪的禮物送禮者

譯 by tim green

對于一群要互送禮物的朋友,你要確定每個人送出的禮物比收到的多多少(and vice versa for those who view gift giving with cynicism)。
在這一個問題中,每個人都準備了一些錢來送禮物,而這些錢將會被平均分給那些將收到他的禮物的人。
然而,在任何一群朋友中,有些人將送出較多的禮物(可能是因為有較多的朋友),有些人有準備了較多的錢。
給出一群朋友, 沒有人的名字會長于 14 字符,給出每個人將花在送禮上的錢,和將收到他的禮物的人的列表,
請確定每個人收到的比送出的錢多的數目。

IMPORTANT NOTE

測試系統是 Linux 符合標準的 Unix 的協定。
用'\n'作為行的結束
這和 Windows 系統用'\n' 和 '\r'作為行的結束是不同的。
你的程序不要被這困住了。

PROGRAM NAME: gift1

INPUT FORMAT第 1 行: 人數NP,2<= NP<=10??

第 2到 NP+1 行:
這NP個在組里人的名字 一個名字一行

第NP+2到最后:
這里的NP段內容是這樣組織的:
第一行是將會送出禮物人的名字。
第二行包含二個數字: 第一個是原有的錢的數目(在0到2000的范圍里),第二個NGi是將收到這個送禮者禮物的人的個數 如果 NGi 是非零的, 在下面 NGi 行列出禮物的接受者的名字,一個名字一行。



SAMPLE INPUT (file gift1.in)

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

OUTPUT FORMAT

輸出 NP 行
每行是一個的名字加上空格再加上收到的比送出的錢多的數目。
對于每一個人,他名字的打印順序應和他在輸入的2到NP+1行中輸入的順序相同。所有的送禮的錢都是整數。
每個人把相同數目的錢給每位要送禮的朋友,而且盡可能多給,不能給出的錢被送禮者自己保留。

SAMPLE OUTPUT (file gift1.out)

dave 302
laura 66
owen -359
vick 141
amr -150



這個題也很簡單,主要就是說把每個人的錢給其他人分一下就行了。
唯一麻煩一點的就是對人名的處理,我是直接比較的,沒什么好方法。再有一個就是注意一個人有的錢數不能整除他分錢給的人數的時候要把余數留下。
最后用每個人得到的錢減了給的就行了
#include?"stdio.h"
#include?
"stdlib.h"
#define?S?20
struct?peo
{
????
char?name[S];
????
int?get;
????
int?have;
????
int?m;
}
p[11];
int?n;

int?scmp(char?*s1,char?*s2)
{
????
int?i=0;
????
if(strlen(s1)!=strlen(s2))
????????
return?0;
????
while(s1[i]!='\0')
????
{
????????
if(s1[i]!=s2[i])
????????????
return?0;
????????i
++;
????}

????
return?1;
}


int?getname(char?*s)
{
????
int?i;
????
for(i=0;i<n;i++)
????
{
????????
if(scmp(s,p[i].name))
????????????
return?i;
????}

}


void?input()
{
????
int?i,j,t;
????
int?now;
????scanf(
"%d",&n);
????
for(i=0;i<n;i++)
????
{
????????scanf(
"%s",p[i].name);
????????getchar();
????????p[i].
get=0;
????}

}


void?work()
{
????
int?i,j,t;
????
char?str[S];
????
int?now,tmp;
????
for(t=0;t<n;t++)
????
{
????????scanf(
"%s",str);
????????getchar();
????????now
=getname(str);
????????scanf(
"%d%d",&p[now].have,&p[now].m);
????????getchar();
????????
for(i=0;i<p[now].m;i++)
????????
{
????????????scanf(
"%s",str);
????????????getchar();
????????????tmp
=getname(str);
????????????p[tmp].
get+=p[now].have/p[now].m;
????????}

????????
if(p[now].m)
????????????p[now].
get+=p[now].have%p[now].m;
????}

}


void?output()
{
????
int?i;
????
for(i=0;i<n;i++)
????
{
????????printf(
"%s?%d\n",p[i].name,p[i].get-p[i].have);
????}

}


int?main()
{
????freopen(
"gift1.in","r",stdin);
????freopen(
"gift1.out","w",stdout);
????input();
????work();
????output();
????exit(
0);
}