题目: | 贪婪的送礼者 | |
来源: | Usaco1.1.2 | |
题目大意: | 有N个人,每个人会把自己手里的钱平均送给自己想送的人,也会收到一些人送的 钱,按最后送出和获得的差值由大到小输出人名和值 | |
数据范围: | 每个字符串不超过6个字符 | |
样例: |
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 |
做题思路: | 别想别的,模拟就好,每个人以0 0结尾的,把送出的钱和收到的分开记,这算贪心 吧,姑且这么算着了 | |
知识点: | 模拟、贪心 |
{
ID:Dount Nameless
TASK:gift1
LANG:PASCAL
}
type
node=record
s:string;
data:longint;
money:longint;
end;
var
a:array[0..11]of node;
n,i,j,m,num,k,t:longint;
s:string;
begin
assign(input,'gift1.in');reset(input);
assign(output,'gift1.out');rewrite(output);
readln(n);
fori:=1 to n do
readln(a[i].s);
fori:=1 to n do
begin
readln(s);
for j:=1 to n do
if s=a[j].s then t:=j;{<查找这个人>}
readln(num,m);
ifm<>0 then{<有钱才能送呢>}
a[t].money:=(num div m)*m{<这里记录的是送出的,不是自己当时拥有的>}
else a[t].money:=0;
for j:=1 to m do
begin
readln(s);
for k:=1 to n do
if a[k].s=s then inc(a[k].data,num div m);{<收到的钱>}
end;
end;
fori:=1 to n do
begin
writeln(a[i].s,' ',a[i].data-a[i].money);{<差值>}
end;
close(input);close(output);
end.
题目来源:
http://ace.delos.com/usacoprob2?a=RexmW8CclSt&S=gift1