P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers

P1201题库链接:https://www.luogu.org/problem/P1201

难度:普及-

算法标签:模拟

1.map映射模拟 O(np*m) 得分100

由于最近做的map题比较多,所以马上就想到了map做法,嗑了快一个小时,终于写出了正解,输入时用s数组记录人名的顺序,方便输出,并建立两个map,分别表示每个人收到的钱(get)和送出的钱(put),利用人名(string)作为map的Key值。当送出礼物时,让give[giver]加上送出的每个礼物的价值(注意价值是整数,需要下取整) * 人数,表示送出礼物所花费的钱;当收到礼物时,让get[geter]不断加上所收到的礼物的价值,即为所收到礼物的总价值。最后输出时,依次输出用每个人收到礼物的价值减去送礼物花费的钱,即为他收到的钱比送出的钱多的数目

 1 #include <iostream>
 2 #include <cmath>
 3 #include <map>
 4 using namespace std;
 5 map<string, int> get;
 6 map<string, int> give;
 7 string s[11];
 8 int main()
 9 {
10     int np;
11     cin >> np;
12     for(int i = 0; i < np; ++i)
13     {
14         cin >> s[i];
15         get[s[i]] = 0;
16         give[s[i]] = 0;
17     }
18     for(int i = 1; i <= np; ++i)
19     {
20         int m, e;
21         double n;
22         string giver;
23         cin >> giver >> n >> m;
24         e = floor(n / m);
25         give[giver] += e * m;
26         for(int j = 1; j <= m; ++j)
27         {
28             string geter;
29             cin >> geter;
30             get[geter] += e;
31         }
32     }
33     for(int i = 0; i < np; ++i)
34         cout << s[i] << ' ' << get[s[i]] - give[s[i]] << endl;
35     return 0;
36 } 
posted @ 2019-08-03 09:20  ZRQ666  阅读(244)  评论(0编辑  收藏  举报