2008年8月29日 星期五

Problem 119 Greedy Gift Givers 貪心的送禮者

這題目中,每次送禮者最多十人,每個人送出一個數字的金額,平均分配給指定的人。題目的要求在計算每個送禮者到底是收了多少錢,或付出多少錢。
題目說是貪心的送禮者,就是說你要斤斤計較,到底誰賺誰賠,所以多收了就賺到了,少收了就賠了,那斤斤計較的過程就顯得有點貪心,這樣說,對嗎?管它的,寫程式吧。

這個ACM 題目是練習C語言結構的好機會,程式的結構定義如下,name是名字,mget是淨收入。
typedef struct
{
char name[20];
int mget;
} person;

由於輸入格式中,並未告知有多少案例,題目所列的示範是兩個案例,因此程式可以用
while (scanf("%d", &n)!= EOF)
來判斷是否還有下一個案例。
每次執行前,別忘了將所有人的變數設定為初設值。
在讀取每個人的付出時,就可以先計算每個人的淨支出,別忘了不能整除時,要將餘數留著,C語言程式碼如下所示。
scanf("%s%d%d", givename, &give_amount, &m);
if (strcmp(givename, P[k].name)==0)
{
if (m!=0)
P[k].mget -= give_amount;
if (m!=0)
P[k].mget += give_amount%m;
}

然後,讀取付給哪些人,使用 strcmp 進行姓名字串的比較,比較輸出為 0 時,表示兩個字串相等,這時就可以將那個人的收入進行累加,程式如下。
if (strcmp(getname, P[k].name)==0)
P[k].mget += give_amount / m;

其實,程式是很簡單的,但是要注意一種狀況,就是有付出金額,分配人員的數量是零的情形,也就是上述程式碼 m 為零的情形,因為題目也沒說會有設定分配人數是零的情形 (很詐),如果沒考慮這點,上傳就會收到 wrong answer,這種情形最ㄐㄧㄢˋ,誰曉得是為什麼錯。
另外,要注意輸出的案例與案例之間要空一行。
p119題目連結
回ACM題庫目錄
回首頁

沒有留言: