#include <stdio.h>
#include <string.h>
void main ()
{
FILE *fin = fopen ("gift1.in", "r");
FILE *fout = fopen ("gift1.out", "w");
int i,j,k,n,income[20]={0},outcome[20]={0},num=0,count=0; //设两个数组income、outcome分别记录每个人的支出和收入情况
char name[20][20],temp[20];
fscanf (fin, "%d", &n);
for(i=0;i<n;i++)
fscanf(fin,"%s",name[i]); //读入每个人的名字
for(i=0;i<n;i++)
{
fscanf(fin,"%s\n%d %d",temp,&count,&num);
for(j=0;j<n;j++)
if(strcmp(name[j],temp)==0) //查找这是第几个人
{
outcome[j]=num==0?0:count-count%num; //记下他的人支出,此处注意要判断num==0,否则出错
break;
}
for(j=0;j<num;j++)
{
fscanf(fin,"%s",temp);
for(k=0;k<n;k++)
if(strcmp(name[k],temp)==0) //查找到收到该人礼物的人,使他们的收入增加
{
income[k]+=count/num;
break;
}
}
}
for(i=0;i<n;i++)
{
fprintf(fout,"%s %d\n",name[i],income[i]-outcome[i]);
}
exit (0);
}
这是想到的最直接的方式,时间复杂度为O(n^3),如果能把查找的复杂度降低到O(1),则整体复杂度能达到O(n^2)。有人说可以用HASH,目前还不怎么会。留待以后学习。