The rules for gift-giving are potentially different than you might expect. Each person sets aside a certain amount of money to give and divides this money evenly among all those to whom he or she is giving a gift. No fractional money is available, so dividing 3 among 2 friends would be 1 each for the friends with 1 left over -- that 1 left over stays in the giver's "account".
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, no one of whom has a name longer than 14 characters, the money each person in the group spends on gifts, and a (sub)list of friends to whom each person gives gifts, determine how much more (or less) each person in the group gives than they receive.INPUT FORMAT
Line 1:The single integer, NP
Lines 2..NP+1: Each line contains the name of a group member
/* ID: fuchenc1 PROG: gift1 LANG: C++ */ #include <iostream> #include <map> #include <fstream> #include <string> using namespace std; int Solution() { ifstream fin("gift1.in"); ofstream fout("gift1.out"); const int NP_MAX=10+2; int NP; fin>>NP; map<string,int> mapPersonGifts; string arrayRecord[NP_MAX]; for(int i=0;i<NP;i++) { string strPersonName; fin>>strPersonName; arrayRecord[i]=strPersonName; mapPersonGifts[strPersonName]=0; } for(int i=0;i<NP;i++) { int nMoney,nPersonCnt; string strGiverName; fin>>strGiverName>>nMoney>>nPersonCnt; int aveMoney=0; if(nPersonCnt) { aveMoney=nMoney/nPersonCnt; } for(int j=0;j<nPersonCnt;j++) { string strReciverName; fin>>strReciverName; mapPersonGifts[strReciverName]+=aveMoney; } mapPersonGifts[strGiverName]+=(-aveMoney*nPersonCnt); } map<string ,int>::const_iterator map_it=mapPersonGifts.begin(); for(int i=0;i<NP;i++) { fout<<arrayRecord[i]<<" "<<mapPersonGifts[arrayRecord[i]]<<endl; } return 0; } int main() { return Solution(); }
因为采用了map容器,所以处理起来比较方便,但是需要注意的是题目要求按照名字输入顺序输出每个人的礼物情况,而map容器对元素的排序是根据元素的key类型进行排序,所以如果直接遍历map容器进行输出,就会是按照名字的升序输出,所以答案会出错,所以我另外用了一个数组记录下输入名字的顺序。
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define MAXPEOPLE 10
#define NAMELEN 32
typedef struct Person Person;
struct Person {
char name[NAMELEN];
int total;
};
Person people[MAXPEOPLE];
int npeople;
void addperson(char *name)
{
assert(npeople < MAXPEOPLE);
strcpy(people[npeople].name, name);
npeople++;
}
Person* lookup(char *name)
{
int i;
/* look for name in people table */
for(i=0; i<npeople; i++)
if(strcmp(name, people[i].name) == 0)
return &people[i];
assert(0); /* should have found name */
}
int main(void)
{
char name[NAMELEN];
FILE *fin, *fout;
int i, j, np, amt, ng;
Person *giver, *receiver;
fin = fopen("gift1.in", "r");
fout = fopen("gift1.out", "w");
fscanf(fin, "%d", &np);
assert(np <= MAXPEOPLE);
for(i=0; i<np; i++) {
fscanf(fin, "%s", name);
addperson(name);
}
/* process gift lines */
for(i=0; i<np; i++) {
fscanf(fin, "%s %d %d", name, &amt, &ng);
giver = lookup(name);
for(j=0; j<ng; j++) {
fscanf(fin, "%s", name);
receiver = lookup(name);
giver->total -= amt/ng;
receiver->total += amt/ng;
}
}
/* print gift totals */
for(i=0; i<np; i++)
fprintf(fout, "%s %d\n", people[i].name, people[i].total);
exit (0);
}