對於一羣要互送禮物的朋友,你要確定每個人送出的禮物比收到的多多少(and vice versa for those who view gift giving with cynicism)。
在這一個問題中,每個人都準備了一些錢來送禮物,而這些錢將會被平均分給那些將收到他的禮物的人。
然而,在任何一羣朋友中,有些人將送出較多的禮物(可能是因爲有較多的朋友),有些人有準備了較多的錢。
給出一羣朋友, 沒有人的名字會長於 14 字符,給出每個人將花在送禮上的錢,和將收到他的禮物的人的列表,
請確定每個人收到的比送出的錢多的數目。
第 1 行: |
人數NP,2<= NP<=10 |
第 2到 NP+1 行: |
這NP個在組裏人的名字 一個名字一行 |
第NP+2到最後: |
這裏的NP段內容是這樣組織的: |
輸出 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
題解:這道題是一道比較水的題,可以用結構體寫,但是由於博主剛學了map函數,所以運用一下,那這道題練練手。
下面是代碼:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<climits>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<queue>
#include<stack>
using namespace std;
int main()
{
int N;
scanf("%d", &N);
map<string, int> mp;
string s, ch[15];
for(int i = 0; i < N; i++)
{
cin>>ch[i];
mp[ch[i]] = 0;
}
int n, m, t = N;
while(t--)
{
int temp;
cin>>s>>n>>m;
if(m == 0)
mp[s] += n;
else
{
mp[s] -= n;
temp = n/m;
mp[s] += n-(temp*m);
for(int i = 0; i < m; i++)
{
cin>>s;
mp[s] += temp;
}
}
}
for(int i = 0; i < N; i++)
{
cout<<ch[i]<<" "<<mp[ch[i]]<<endl;
}
}