2455 - 贪婪的礼物送礼者
对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa
for those who view gift giving with
cynicism)。
在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。
然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。
给出一群朋友, 没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表,
请确定每个人收到的比送出的钱多的数目。
<b><span>IMPORTANT NOTE</span></b>
测试系统是 <span>Linux </span>符合标准的 <span>Unix </span>的协定。<br />
用'\n'作为行的结束。
这和 Windows 系统用'\n' 和 '\r'作为行的结束是不同的。
你的程序不要被这困住了。
题目输入
输入包含多组测试数据
|
第 1 行: |
人数NP,2<= NP<=10 |
|
第 2到 NP+1 行: |
这NP个在组里人的名字 一个名字一行 |
|
第NP+2到最后: |
这里的NP段内容是这样组织的: 第二行包含二个数字: 第一个是原有的钱的数目(在0到2000的范围里),第二个NGi是将收到这个送礼者礼物的人的个数 如果 NGi 是非零的, 在下面 NGi 行列出礼物的接受者的名字,一个名字一行。
|
题目输出
输出 NP 行
每行是一个的名字加上空格再加上收到的比送出的钱多的数目。
对于每一个人,他名字的打印顺序应和他在输入的2到NP+1行中输入的顺序相同。所有的送礼的钱都是整数。
每个人把相同数目的钱给每位要送礼的朋友,而且尽可能多给,不能给出的钱被送礼者自己保留。
输入/输出样例
输入格式
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
输出格式
dave 302 laura 66 owen -359 vick 141 amr -150
C++解答
#include <stdio.h> #include <string.h> int main() { int n; while(scanf("%d",&n)!=EOF){ char name1[10][14];/*=(char **)malloc(sizeof(char));*/ char name2[10][14];/*=(char **)malloc(sizeof(char));*/ getchar(); for(int i=0;i<n;i++) { scanf("%s",name1[i]); getchar(); } int money[10]; int people[10]; int getmoney[10]={0}; for(int i=0;i<n;i++){ scanf("%s",name2[i]); getchar(); scanf("%d%d",&money[i],&people[i]); getchar(); /*if(money[i]==0||people[i]==0) continue;*/ int s=0; for( s=0;s<n;s++){/*给每个送出礼物的人减去他们所送出的钱*/ if(strcmp(name2[i],name1[s])==0){ getmoney[s]-=money[i]; break;} } for(int j=0;j<people[i];j++){ char str[10][14];/*不能用一维数组,必须要用二维的,否则就不能输入*/ scanf("%s",str[j]); getchar(); if(money[i]!=0&&people[i]!=0){ for(int r=0;r<n;r++){ if(strcmp(str[j],name1[r])==0){ getmoney[r]+=money[i]/people[i]; break; } } } } if(money[i]!=0&&people[i]!=0) getmoney[s]+=money[i]%people[i];/*如果分配不均匀的话,剩余归自己*/ } for(int w=0;w<n;w++){ for(int v=0;v<strlen(name1[w]);v++) printf("%c",name1[w][v]); printf(" "); printf("%d",getmoney[w]); printf("\n"); } } return 0; }