是一道很多人认为很水但是对于我来说还是很有难度的题目,贪婪的礼物送礼者。
输入描述 Input Description
第 1 行: |
人数NP,2<= NP<=10 |
第 2到 NP+1 行: |
这NP个在组里人的名字 一个名字一行 |
第NP+2到最后: |
这里的NP段内容是这样组织的: |
输出描述 Output Description
输出 NP 行
每行是一个的名字加上空格再加上收到的比送出的钱多的数目。
对于每一个人,他名字的打印顺序应和他在输入的2到NP+1行中输入的顺序相同。所有的送礼的钱都是整数。
每个人把相同数目的钱给每位要送礼的朋友,而且尽可能多给,不能给出的钱被送礼者自己保留。
样例输入 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
测试系统是 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>
欧啦!