Problem 2
题目描述:有2-10个人,每个人初始资金都是0,然后相互给钱,输入数据是人名,给出去的钱和给几个人钱,输出是最后各个人钱的结果。
感想:认真做USACO的第二题,用了STL的map还是很好实现的。可是碰到了一个问题,因为map的内部结构,用迭代器加在map上输出的时候的顺序并不和输入的顺序完全一样。给了我很大困扰。最后是再开了一个vector顺利解决问题。虽然STL非常的厉害,但是看题解的时候发现有很多C风格的答案,看上去非常简洁,要用力学习下。
下面是我的代码,我尽量把变量名写好。
#include <iostream> #include <fstream> #include <string> #include <map> #include <vector> using namespace std; int main() { ofstream fout("gift1.out"); ifstream fin("gift1.in"); int np; fin >> np; map<string, int> mymap; vector<string> res; // initialization, map and vector for (int i = 0; i < np; ++i) { string s; fin >> s; mymap.insert(make_pair(s, 0)); res.push_back(s); } for (int i = 0; i < np; ++i) { string giver; int gi, p; fin >> giver >> gi >> p; int money = 0, rest = 0; mymap[giver] -= gi; if (p != 0) { money = gi / p; rest = gi - ((gi / p) * p); mymap[giver] += rest; } else { mymap[giver] += gi; } for (int j = 0; j < p; ++j) { string s; fin >> s; mymap[s] += money; } } for (vector<string>::iterator it = res.begin(); it != res.end(); ++it){ fout << *it << " " << mymap[*it] << endl; } return 0; }
=====================================================================================
关于别人的代码的话,我读了一下。
1.我自己的代码实现没有那么丑的,写成上面那样主要是在设计的时候没有考虑到vector,所以初始化的时候又重新弄了一遍,完全可以在第二遍遍历的过程中再进行初始化,而在第一遍初始化的时候只初始化vector。并且在判断p是不是0的时候如果money或者p是0完全就可以直接continue了不用分case写的。
2.如果不用STL的话,那么就要多开数组,其中一个数组是记名字的,另一个是记钱数目的,比如说a[1] is bob, then b[1] should be the money that bob have.
但是这样的话在查找的时候需要多一点循环。脑子的回路可能要多一点。