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 }