贪婪的礼物赠送者执行错误

时间:2015-06-30 22:58:02

标签: c

我编写的代码有运行时错误 这是问题陈述 一群NP(2≤NP≤10)独特的朋友决定交换金钱的礼物。这些朋友中的每一个可能会或可能不会向任何或所有其他朋友提供一些钱。同样,每个朋友可能会或可能不会从任何或所有其他朋友那里收钱。你在这个问题上的目标是推断每个人给予的收入比收到的多多少。

赠送礼物的规则可能与您预期的不同。每个人都留出一定数量的钱给予并将这笔钱平均分配给他或她送给他们的所有人。没有可用的小数部分资金,因此将2个朋友中的3分别为剩下1个朋友的1个 - 剩下的1个留在提供者的“帐户”中。

在任何一群朋友中,有些人比其他人更有奉献(或者至少可能有更多的熟人),有些人比其他人有更多的钱。

鉴于一群朋友,其中没有一个人的姓名超过14个字符,该组中每个人花在礼物上的钱,以及每个人送给他们的礼物的(子)列表,决定了多少组中每个人给予的比他们收到的更多(或更少)。

重要提示

平地机是一台使用标准Unix约定的Linux机器:行尾是一个通常称为'\ n'的单个字符。这与Windows不同,后者以两个字符'\ n'和'\ r'结束行。不要让你的程序被这个困住!

计划名称:gift1

输入格式

第1行:单个整数,NP 第2..NP + 1行:每行包含一个组成员的名称 行NP + 2..end:NP组的行组织如下: 小组的第一行告诉该人姓名谁将赠送礼物。 该组中的第二行包含两个数字:初始金额(在0..2000范围内)由提供者分成礼物,然后是给予者赠送礼物的人数,NGi(0 ≤Nii≤NP-1)。 如果NGi非零,则下一个NGi行中的每一行都列出礼物接收者的姓名。 SAMPLE INPUT(文件gift1.in)

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

输出格式

输出是NP行,每行都有一个人的名字,后跟一个空格,后跟该人的净收益或损失(final_money_value - initial_money_value)。名称应按照它们在输入的第2行显示的顺序打印。

所有礼物都是整数。每个人向给予任何金钱的每个朋友提供相同的整数金额,并尽可能多地给予满足此约束的金额。任何未给予的钱都由给予者保管。

SAMPLE OUTPUT(文件gift1.out)

dave 302
laura 66
owen -359
vick 141
amr -150

我的解决方案

#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void)
{
    int n,i,j,k,money,people,tmoney[10],gmoney;
    char name[10][20],giver[20],reciver[20];
    FILE *fin=fopen("gift1.in","r");
    FILE *fout=fopen("gift1.out","w");
    //scanf("%d",&n);
    fscanf(fin,"%d",&n);
    for(i=0;i<n;i++)
        tmoney[i]=0;
    for(i=0;i<n;i++)
    fscanf(fin,"%s",(char *)&name[i][0]);
    //scanf("%s",&name[i]);
for(i=0;i<n;i++)
{
    //scanf("%s",giver);
    fscanf(fin,"%s",giver);
    //scanf("%d %d",&money,&people);
    fscanf(fin,"%d %d",&money,&people);
    if(people!=0)
    gmoney=floor(money/people);
    j=0;        
    while(strcmp(giver,name[j]))
        j++;
    tmoney[j]+=money-(gmoney*people);
    for(k=0;k<people;k++)
    {
        //scanf("%s",reciver);
        fscanf(fin,"%s",reciver);
        j=0;
        while(strcmp(reciver,name[j]))
            j++;
        tmoney[j]+=gmoney;
    }


}

for(i=0;i<n;i++)
    fprintf(fout,"%s %d",&name[i][0],tmoney[i]);
    //printf("%s %d\n",name[i],tmoney[i]);
return 0;

}

1 个答案:

答案 0 :(得分:0)

拟议修正案

fscanf(fin,"%d %d",&money,&people);
if(people == 0)//avoid devide by 0
    gmoney = 0;
else
    gmoney=floor(money/people);

...
tmoney[j] -= money;//insert : (final_money_value - initial_money_value) 
tmoney[j]+=money-(gmoney*people);