这道题如果按照一般的思路来写的话,要有反复的去确定发钱的人名对应的是第几个人。所以决定采用map键值对应的方法去写。
map键值对应:
这里先写用到的有点,以后还会有所补充。参考:
http://blog.csdn.net/flqbestboy/article/details/8184484
注意: map<string,int>
以及键值对的赋值,和用迭代器读取键值对(或直接读取操作)。
代码如下:
/*
ID:m1519591
PROG: gift1
LANG:C++
*/
#include<iostream>
#include<fstream>
#include<string>
#include<map>
using namespace std;
int main()
{
ofstream fout("gift1.out");
ifstream fin("gift1.in");
int n;
map<string ,int>name;
string name0;
fin>>n;
for(int i=0;i<=n-1;i++)
{
fin>>name0;
name[name0]=0;//此人对应的钱数 开始是0
}
int fro,peo,val=0; //发的钱数,人数 没人得到的钱数。
for(int i=0;i<=n-1;i++)
{
fin>>name0>>fro>>peo;
if(peo)
{
val=fro/peo;
name[name0]-=(val*peo);
}
for(int j=0;j<=peo-1;j++)
{
fin>>name0;
name[name0]+=val;
}
}
map<string,int>::const_iterator it;
//用迭代器的方法读出 map键值对中的每个元素值。
for(it=name.begin();it!=name.end();it++)
{
string na=(*it).first;
int mo=(*it).second;
fout<<na<<":"<<mo<<endl;
}
return 0;
}
但这个代码的输出结果和提示输出结果的顺序不一致。 错误。这个实际上是map的进行了自动排序。可以找一下有没有可以按照输入顺序输出的键值对,这里先留住问题,以后再继续。那么我用了一个string数组专门来储存name。代码如下:
#include<iostream>
#include<fstream>
#include<string>
#include<map>
using namespace std;
const int size = 10;
int main()
{
ofstream fout("gift1.out");
ifstream fin("gift1.in");
int n;
string str[size];
map<string ,int>name;
string name0;
fin>>n;
for(int i=0;i<=n-1;i++)
{
fin>>name0;
str[i]=name0;
name[name0]=0;//此人对应的钱数 开始是0
}
int fro,peo,val=0; //发的钱数,人数 没人得到的钱数。
for(int i=0;i<=n-1;i++)
{
fin>>name0>>fro>>peo;
if(peo)
{
val=fro/peo;
name[name0]-=(val*peo);
}
for(int j=0;j<=peo-1;j++)
{
fin>>name0;
name[name0]+=val;
}
}
// hash_map<string,int>::const_iterator it;
// //用迭代器的方法读出 map键值对中的每个元素值。
// for(it=name.begin();it!=name.end();it++)
// {
// string na=(*it).first;
// int mo=(*it).second;
// cout<<na<<":"<<mo<<endl;
// }
for(int i=0;i<=n-1;i++)
{
fout<<str[i]<<" "<<name[str[i]]<<endl;
}
return 0;
}
这里吐槽一句,USACO的提交系统真是想搞事情。