Greedy Gift Givers

貪婪的禮物送禮者

譯 by tim green

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

IMPORTANT NOTE

測(cè)試系統(tǒng)是 Linux 符合標(biāo)準(zhǔn)的 Unix 的協(xié)定。
用'\n'作為行的結(jié)束
這和 Windows 系統(tǒng)用'\n' 和 '\r'作為行的結(jié)束是不同的。
你的程序不要被這困住了。

PROGRAM NAME: gift1

INPUT FORMAT第 1 行: 人數(shù)NP,2<= NP<=10??

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

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



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 行
每行是一個(gè)的名字加上空格再加上收到的比送出的錢多的數(shù)目。
對(duì)于每一個(gè)人,他名字的打印順序應(yīng)和他在輸入的2到NP+1行中輸入的順序相同。所有的送禮的錢都是整數(shù)。
每個(gè)人把相同數(shù)目的錢給每位要送禮的朋友,而且盡可能多給,不能給出的錢被送禮者自己保留。

SAMPLE OUTPUT (file gift1.out)

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



這個(gè)題也很簡(jiǎn)單,主要就是說把每個(gè)人的錢給其他人分一下就行了。
唯一麻煩一點(diǎn)的就是對(duì)人名的處理,我是直接比較的,沒什么好方法。再有一個(gè)就是注意一個(gè)人有的錢數(shù)不能整除他分錢給的人數(shù)的時(shí)候要把余數(shù)留下。
最后用每個(gè)人得到的錢減了給的就行了
#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);
}