Greedy Gift Givers 程序 - 今天開始刷USACO
有點晚了,但是,USACO很能考驗基礎數據結構和算法的熟練度。
題目描述
對於一群要互送禮物的朋友,你要確定每個人收到的禮物比送出的多多少(and vice versa for those who view gift giving with cynicism)(,反之亦然對於那些用貪婪的眼光來看禮物的人(by John))。
在這一個問題中,每個人都準備了一些錢來送禮物,而這些錢將會被平均分給那些將收到他的禮物的人。 然而,在任何一群朋友中,有些人將送出較多的禮物(可能是因為有較多的朋友),有些人有準備了較多的錢。
給出一群朋友, 沒有人的名字會長於 14 字符,給出每個人將花在送禮上的錢,和將收到他的禮物的人的列表,請確定每個人收到的比送出的錢多的數目。 格式
PROGRAM NAME: gift1
INPUT FORMAT:
(file gift1.in)
第 1 行: 人數NP,2<= NP<=10
第 2到 NP+1 行:這NP個在組裡人的名字 一個名字一行
第NP+2到最後:
這裡的NP段內容是這樣組織的:
第一行是將會送出禮物人的名字。
第二行包含二個數字: 第一個是原有的錢的數目(在0到2000的範圍裡),第二個 NGi 是將收到這個送禮者禮物的人的個數 如果 NGi 是非零的, 在下面 NGi 行列出禮物的接受者的名字,一個名字一行。
OUTPUT FORMAT:
(file gift1.out)
輸出 NP 行
每行是一個的名字加上空格再加上收到的比送出的錢多的數目。
對於每一個人,他名字的打印順序應和他在輸入的2到NP+1行中輸入的順序相同。所有的送禮的錢都是整數。
每個人把相同數目的錢給每位要送禮的朋友,而且儘可能多給,不能給出的錢被送禮者自己保留。
IMPORTANT NOTE:
測試系統是 Linux 符合標準的 Unix 的協定。 用’\n’作為行的結束。這和 Windows 系統用’\n’ 和 ‘\r’作為行的結束是不同的。 你的程序不要因此受困。 SAMPLE INPUT
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
SAMPLE OUTPUT
dave 302 laura 66 owen -359 vick 141 amr -150
我的程序
{
ID:ceeji
PROB:gift1
LANG:PASCAL
}
Program gift1;
var
name:array[1..20]of string;
q,n:array[1..20]of longint;
incom,outcom:array[1..20]of longint;
np,i,j,h,h2:longint;
s,s2:string;
Function getBH(s:string):longint;
var i:longint;
begin
for i:=1 to np do
begin
if s=name[i] then exit(i);
end;
exit(0);
end;
begin
assign(input,'gift1.in'); reset(input);
assign(output,'gift1.out'); rewrite(output);
readln(np);
fillchar(incom,sizeof(incom),0);
fillchar(outcom,sizeof(outcom),0);
for i:=1 to np do
begin
readln(name[i]);
end;
while eof(input)=false do
begin
readln(s);
h:=getBH(s);
readln(q[h],n[h]);
for i:=1 to n[h] do
begin
readln(s2);
h2:=getBH(s2);
inc(incom[h2],q[h] div n[h]);
inc(outcom[h],q[h] div n[h]);
end;
end;
close(input);
for i:=1 to np do
begin
writeln(name[i],' ',incom[i]-outcom[i]);
end;
close(output);
end.
© 轉載需附帶本文連結,依 CC BY-NC-SA 4.0 釋出。