您的位置:首页 > 其它

洛谷 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers

2017-02-12 10:53 375 查看
题目描述

对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少。在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。给出一群朋友,没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表,请确定每个人收到的比送出的钱多的数目。

输入输出格式

输入格式:

第 1 行: 人数NP,2<= NP<=10

第 2 行 到 第NP+1 行:这NP个在组里人的名字一个名字一行

第NP+2到最后:

这里的I段内容是这样组织的:

第一行是将会送出礼物人的名字。

第二行包含二个数字:第一个是原有的钱的数目(在0到2000的范围里),第二个 NGi 是将收到这个人礼物的人的个数 如果 NGi 是非零的, 在下面 NGi 行列出礼物的接受者的名字,一个名字一行。

输出格式:

输入输出样例

输入样例#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

输出样例#1:

dave 302

laura 66

owen -359

vick 141

amr -150

说明

题目翻译来自NOCOW。

USACO Training Section 1.1

分析:纯模拟+字符串处理。

注意:除不尽时,剩下的钱要留在送礼人的手里,因为c++里除法是刚好向下取整的,所以这里直接用.(例子:100/3=33…1,那一块钱要留在送礼人手里。),有可能除数为0,要特判。

代码:

type
node=record
name:string;
money:longint;
end;

var
a:array[0..15] of node;
n,i,j,k,kk,jj,x,y:longint;
st:string;
begin
readln(n);
for i:=1 to n do
readln(a[i].name);
for i:=1 to n do
begin
readln(st);
k:=0;
for j:=1 to n do
if st=a[j].name then k:=j;
readln(x,y);
if (x<>0)and(y<>0) then
a[k].money:=a[k].money+(-1)*x+(x-((x div y)*y));
for j:=1 to y do
begin
readln(st);
kk:=0;
for jj:=1 to n do
if st=a[jj].name then kk:=jj;
if (x<>0)and(y<>0) then
a[kk].money:=a[kk].money+x div y;
end;
end;
for i:=1 to n do
writeln(a[i].name,' ',a[i].money);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: