USACO 1.1 Problem 2

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值