Greedy Gift Givers |
This problem involves determining, for a group of gift-giving friends, how much more each person gives than they receive (and vice versa for those that view gift-giving with cynicism).
In this problem each person sets aside some money for gift-giving and divides this money evenly among all those to whom gifts are given.
However, in any group of friends, some people are more giving than others (or at least may have more acquaintances) and some people have more money than others.
Given a group of friends, the money each person in the group spends on gifts, and a (sub)list of friends to whom each person gives gifts; you are to write a program that determines how much more (or less) each person in the group gives than they receive.
The input is a sequence of gift-giving groups. A group consists of several lines:
All names are lower-case letters, there are no more than 10 people in a group, and no name is more than 12 characters in length. Money is a non-negative integer less than 2000.
The input consists of one or more groups and is terminated by end-of-file.
For each group of gift-givers, the name of each person in the group should be printed on a line followed by the net gain (or loss) received (or spent) by the person. Names in a group should be printed in the same order in which they first appear in the input.
The output for each group should be separated from other groups by a blank line. All gifts are integers. Each person gives the same integer amount of money to each friend to whom any money is given, and gives as much as possible. Any money not given is kept and is part of a person's ``net worth'' printed in the output.
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 3 liz steve dave liz 30 1 steve steve 55 2 liz dave dave 0 2 steve liz
dave 302 laura 66 owen -359 vick 141 amr -150 liz -3 steve -24 dave 27
#include<stdio.h> #include<string.h> struct man{char s[15];int m;}p[12]; char temp[15]; int main() { int n,i,j,k,pay,num,f=0; while(scanf("%d",&n)!=EOF) { if(f) printf("\n"); f=1; memset(&p,0,sizeof(p)); for(i=0;i<n;i++) scanf("%s",p[i].s); for(i=0;i<n;i++) { scanf("%s%d%d",temp,&pay,&num); for(j=0;j<n;j++) if(!strcmp(temp,p[j].s)) if(num) p[j].m-=num*(pay/num); for(k=0;k<num;k++) { scanf("%s",temp); for(j=0;j<n;j++) if(!strcmp(temp,p[j].s)) p[j].m+=pay/num; } } for(i=0;i<n;i++) printf("%s %d\n",p[i].s,p[i].m); } return 0; }