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.
当前页阅读量为: