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.
但是这样的话在查找的时候需要多一点循环。脑子的回路可能要多一点。