USACO 1.1.2 Greedy Gift Givers(gift1)

这道题大意就是几个人互送礼物,让你求每个人的盈利。

原题给的样例数据:

5(人的个数。)

=========(下面是人名,输出按照这顺序)
dave
laura
owen
vick
amr

==========(下面是每个人的要给的人)
dave
200 3
laura
owen
vick

----------
owen
500 1
dave

----------
amr
150 2
vick
owen

-----------
laura
0 2
amr
vick

----------
vick
0 0

这题使用模拟算法就行了,就是注意输入的时候不要掉坑里了。

还有就是比如说自己有200快钱给3个人,每个人得到66块,剩下两块自己收,并计入答案。

还有就是想题目里的vick,分给0个人,千万不要除以了0。。对了为了找人名方便,可以把一个人的名字和编号存到一个map容器中,具体在代码里已经有了,就不细说了。

下面是我的程序:

/*
ID:aaabbbr1
LANG:C++
TASK:gift1
*/
#include <stdio.h>
#include <string>
#include <map>
#include <iostream>
using namespace std;
struct person
{
	string name;
	int gave[10],have,cnt,receive;
	person(){have=receive=0;}
}a[10];
map<string,int>link;//这只是方便从人名找到编号而已 
void gavemoney(int x)
{
	if(a[x].cnt==0)return;//小心除以0了(也就是如果给的人数为0就不给了) 
	int per=a[x].have/a[x].cnt;//计算每人多少钱 
	int tot=per*a[x].cnt;//计算一共给多少钱 
	a[x].receive+=a[x].have-tot;//计算自己的零钱 并汇入收到的钱里面 
	for(int i=0;i<a[x].cnt;i++)//给钱 
		a[ a[x].gave[i] ].receive += per;
}
void display(int x)
{
	cout << a[x].name << " " << a[x].receive-a[x].have << "\n";
}
int main()
{
	freopen("gift1.in","r",stdin);
	freopen("gift1.out","w",stdout);
	string tmp;
	int n,x,t1,t2;
	cin >> n;
	for(int i=0;i<n;i++)
	{
		cin >> tmp;
		a[i].name=tmp;
		link[tmp]=i;
	}
	for(int i=0;i<n;i++)
	{
		cin >> tmp;
		x=link[tmp];
		cin >> t1 >> t2;
		a[x].have=t1;
		a[x].cnt=t2;
		for(int j=0;j<a[x].cnt;j++)
		{
			cin >> tmp;
			a[x].gave[j]=link[tmp];
		}
	}
	for(int i=0;i<n;i++)
		gavemoney(i);
	for(int i=0;i<n;i++)
		display(i);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

 

posted @ 2016-07-01 22:12  ghj1222  阅读(251)  评论(0编辑  收藏  举报