现在的位置: 首页 > 综合 > 正文

USACO 1.1 Problem 2

2017年11月21日 ⁄ 综合 ⁄ 共 1288字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.