贪婪的礼物送礼者

本文介绍了一种处理多人间复杂礼物交换场景的算法实现。通过结构体存储参与者信息,运用循环和条件判断来分配礼物费用,并确保每位参与者公平地送出和收到礼物。文章详细展示了从输入处理到输出结果的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

是一道很多人认为很水但是对于我来说还是很有难度的题目,贪婪的礼物送礼者。

输入描述 Input Description

1 :

人数NP,2<= NP<=10

2 NP+1 :

NP个在组里人的名字 一个名字一行

NP2到最后:

这里的NP段内容是这样组织的:
第一行是将会送出礼物人的名字。
第二行包含二个数字: 第一个是原有的钱的数目(在02000的范围里),第二个NGi是将收到这个送礼者礼物的人的个数 如果 NGi 是非零的, 在下面 NGi 行列出礼物的接受者的名字,一个名字一行。

输出描述 Output Description

输出 NP
每行是一个的名字加上空格再加上收到的比送出的钱多的数目。
对于每一个人,他名字的打印顺序应和他在输入的2NP1行中输入的顺序相同。所有的送礼的钱都是整数。
每个人把相同数目的钱给每位要送礼的朋友,而且尽可能多给,不能给出的钱被送礼者自己保留。

样例输入 Sample Input

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


样例输出 Sample Output

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

数据范围及提示 Data Size & Hint

测试系统是 Linux 符合标准的 Unix 的协定。
'\n'作为行的结束。
这和 Windows 系统用'\n' '\r'作为行的结束是不同的。
你的程序不要被这困住了

思路:建立 一个结构体,每一个人的数据都是一个结构体成员,那些数据包括,每个人的姓名,已拥有的钱,送出的钱和收到的钱,(每个人最初拥有送出和收到的钱都为0,要赋初值),然后开始输入数据,用一个for循环输入所有人名,接着,for循环输入发礼物的人名依次与最初输入的所有人名对应位置的进行匹配,(用到strcmp这个库函数,包含在头文件<string.h>里),匹配成功就返回那个人所在结构题的第几个位置,然后在看里面的钱,送出的放一起,收到的放一起,最后输出就是把送出的钱减掉收到的钱就行了。

以下是代码哦:

#include <stdio.h>  
03.#include <string.h>  
04.  
05.  
06.int i,j,k,n,song,shou,qian;  
07.char ren[15];  
08.struct data{  
09.    char name[15];  
10.    int money,in,out,renshu;  
11.}stu[11];  
12.int cmp(struct data p[],char q[])      
13.{  
14.    int i,j;  
15.    for(i=0;i<n;i++)  
16.   {  
17.    j=strcmp(p[i].name,q);  
18.    if(j==0) return i;}  
19.}  
20.  int main()  
21.  {  
22.      scanf("%d",&n);  
23.      for(i=0;i<n;i++)  
24.      {  
25.          scanf("%s",stu[i].name);  
26.          stu[i].in=0;  
27.          stu[i].out=0;  
28.          stu[i].money=0;  
29.      }  
30.      for(i=0;i<n;i++)  
31.      {scanf("%s",ren);  
32.      song=cmp(stu,ren);  
33.      scanf("%d%d",&stu[song].money,&stu[song].renshu);  
34.      if(stu[song].renshu==0)  
35.        continue;  
36.      qian=stu[song].money/stu[song].renshu;  
37.      for(j=0;j<stu[song].renshu;j++)  
38.      {  
39.          scanf("%s",ren);  
40.          shou=cmp(stu,ren);  
41.          stu[song].out+=qian;  
42.          stu[shou].in+=qian;  
43.      }  
44.  
45.      }  
46.      for(i=0;i<n;i++)  
47.      printf("%s%d\n",stu[i].name,stu[i].in-stu[i].out);  
48.      return 0;  
49.  }</p><p>            
50.</p></div></div></div>  
   欧啦!


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值