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; }