【题目描述】
对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少。在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。给出一群朋友,没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表,请确定每个人收到的比送出的钱多的数目。
【输入格式】(gift1.in)
第 1 行: 人数NP,2<= NP<=10
第 2 行 到 第NP+1 行:这NP个在组里人的名字 一个名字一行
第NP+2到最后:
这里的I段内容是这样组织的:
第一行是将会送出礼物人的名字。
【输出格式】(gift1.out)
输出 NP 行
每行是一个的名字加上空格再加上收到的比送出的钱多的数目。
对于每一个人,他名字的打印顺序应和他在输入的2到NP+1行中输入的顺序相同。所有的送礼的钱都是整数。
【输入样例】
5【输出样例】
dave 302
laura 66
owen -359
vick 141
amr -150
这道题两种做法,一种直接模拟即可,另一种用C++中map,代码要简化一点。
直接模拟:
#include<fstream> #include<cstring> using namespace std; ifstream cin ("gift1.in"); ofstream cout("gift1.out"); struct person { string name; int ge; int sh; }person[20]; int n; void readdata() { cin >> n; for(int i = 1;i <= n;i++) { cin >> person[i].name; } } int find(string name) { for(int i = 1;i <= n;i++) { if(person[i].name == name) { return i; } } } void give(string name,int mon) { person[find(name)].sh += mon; } void solve() { for(int i = 1;i <= n;i++) { string name1; int order; int mon1,m; cin >> name1; order = find(name1); cin >> mon1 >> m; for(int j = 1;j <= m;j++) { string name2; int mon2; mon2 = mon1 / m; cin >> name2; give(name2,mon2); //fout << person[find(name2)].money << endl; person[order].ge += mon2; } } for(int i = 1;i <= n;i++) { cout << person[i].name << ' ' << person[i].sh - person[i].ge << endl; } } int main() { readdata(); solve(); return 0; }map版:
#include<fstream> #include<cstring> #include<map> using namespace std; ifstream cin ("gift1.in"); ofstream cout("gift1.out"); string name[20]; map <string,int>give,get; int n; void readdata() { cin >> n; for(int i = 1;i <= n;i++) { cin >> name[i]; } } void song(string name,int mon) { get[name] += mon; } void solve() { for(int i = 1;i <= n;i++) { string name1; int mon1,m; cin >> name1; cin >> mon1 >> m; for(int j = 1;j <= m;j++) { string name2; int mon2; cin >> name2; mon2 = mon1 / m; song(name2,mon2); //使每个人得到mon2的钱 //fout << person[find(name2)].money << endl; give[name1] += mon2; //统计送出的钱 } } for(int i = 1;i <= n;i++) { cout << name[i] << ' ' << get[name[i]] - give[name[i]] << endl; } } int main() { readdata(); solve(); return 0; }