題目描述:
對於一群要互送禮物的朋友,你要確定每個人送出的禮物比收到的多多少(and vice versa for those who view gift giving with cynicism)。
在這一個問題中,每個人都準備了一些錢來送禮物,而這些錢將會被平均分給那些將收到他的禮物的人。
然而,在任何一群朋友中,有些人將送出較多的禮物(可能是因為有較多的朋友),有些人有準備了較多的錢。
給出一群朋友, 沒有人的名字會長於 14 字元,給出每個人將花在送禮上的錢,和將收到他的禮物的人的列表,
請確定每個人收到的比送出的錢多的數目。
輸入
第 1 行: 人數NP,2<= NP<=10
第 2到 NP+1 行: 這NP個在組裡人的名字 一個名字一行
第NP+2到最後: 這裡的NP段內容是這樣組織的: 第一行是將會送出禮物人的名字。 第二行包含二個數字: 第一個是原有的錢的數目(在0到2000的範圍裡),第二個NGi是將收到這個送禮者禮物的人的個數 如果 NGi 是非零的, 在下面 NGi 行列出禮物的接受者的名字,一個名字一行。
輸出
輸出 NP 行
每行是一個的名字加上空格再加上收到的比送出的錢多的數目。
對於每一個人,他名字的列印順序應和他在輸入的2到NP+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
樣例輸出
dave 302
laura 66
owen -359
vick 141
amr -150
正片開始!
這是一道十分淼的題,題意即為:NP個人互相“送錢”,然後叫你求每個人收到的比送出的錢多的數目。
那麼:我們直接開一個結構體,再用map編個序不就OK了?
理論存在,開始Code
#include <bits/stdc++.h>
using namespace std;
int n;
map <string, int> na;//構建map陣列用於快速呼叫p[i].name
struct Node {
string name;
int m1;
int m2;
} p[20];//結構體,name:名字,m1:收入,m2:付出
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
cin >> p[i].name;//輸入
na[p[i].name] = i;//將p[i].name編下標
}
string c;
int a, b;
for (int i = 1; i <= n; i++) {
cin >> c;//輸入
int k = na[c];//獲取c這個人的下標
scanf("%d%d", &a, &b);//輸入
if (b == 0)
continue;//如果要分給0個人,直接進入下一個迴圈,因為x/0這個式子不成立
p[k].m1 = a;
for (int j = 1; j <= b; j++) {
cin >> c;
p[na[c]].m2 += p[k].m1 / b;//“送錢”
p[k].m1 = p[k].m1 / b * b;//注意的問題:送出去的錢是整數!
}
}
for (int i = 1; i <= n; i++) {
cout << p[i].name << ' ';
printf("%d\n", p[i].m2 - p[i].m1);//輸出
}
return 0;//完結撒花!
}
沒登陸的看這裡:
#include <bits/stdc++.h>
using namespace std;
int n;
map <string, int> na;
struct Node {
string name;
int m1;
int m2;
} p[20];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
cin >> p[i].name;
na[p[i].name] = i;
}
string c;
int a, b;
for (int i = 1; i <= n; i++) {
cin >> c;
int k = na[c];
scanf("%d%d", &a, &b);
if (b == 0)
continue;
p[k].m1 = a;
for (int j = 1; j <= b; j++) {
cin >> c;
p[na[c]].m2 += p[k].m1 / b;
p[k].m1 = p[k].m1 / b * b;
}
}
for (int i = 1; i <= n; i++) {
cout << p[i].name << ' ';
printf("%d\n", p[i].m2 - p[i].m1);
}
return 0;
}
最後附上題目鏈:P1201 [USACO1.1] 貪婪的送禮者Greedy Gift Givers - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)