2737 - B . Greedy Gift Givers
时间限制 : 1 秒
内存限制 : 128 MB
对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少。 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。 然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。 给出一群朋友,没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表, 请确定每个人收到的比送出的钱多的数目。
题目输入
多组测试数据。
第 1 行: 人数NP,2<= NP<=10
第 2 行 到 第NP+1 行:这NP个在组里人的名字 一个名字一行
<span style="line-height:1.5;">第NP+2到最后:</span>
<span style="line-height:1.5;font-family:sans-serif;font-size:13px;background-color:#FFFFFF;"> 这里的I段内容是这样组织的:</span>
第一行是将会送出礼物人的名字。
第二行包含二个数字: 第一个是原有的钱的数目(在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 <stdlib.h> #include <string.h> int main() { char name[50][100]; char a[100],b[100]; int income[100]={0}; int outcome[100]={0}; int n,i,t,t2,j,many,num; int temp2; while(~scanf("%d",&n)) { memset(income,0,sizeof(income)); memset(outcome,0,sizeof(outcome)); for(i=1;i<=n;i++) scanf("%s",name[i]); for(i=1;i<=n;i++) { scanf("%s",a); for(t2=1;t2<=n;t2++) { if(strcmp(a,name[t2])==0) {temp2=t2;break;} } scanf("%d%d",&many,&num); if(num==0) { //outcome[i]=0; income[i]+=many; } else { outcome[temp2]=many-many%num; //printf("outcome[%d]=%d \n",temp2,outcome[temp2]); for(j=1;j<=num;j++) { scanf("%s",b); for(t=1;t<=n;t++) { if(strcmp(b,name[t])==0) income[t]+=many/num; // printf("income[%d]=%d \n",t,income[t]); } } } } for(i=1;i<n;i++) { //printf("%s ",name[i]); //printf("outcome[%d]=%d ",i,outcome[i]); printf("%s ",name[i]); printf("%d\n",income[i]-outcome[i]); } printf("%s ",name[n]); printf("%d\n",income[n]-outcome[n]); } return 0; }
C++解答
#include<iostream> #include<fstream> #include<string> #include<map> using namespace std; int main() { int np; while(cin>>np){ string names[50]; map <string,int> reci,given; for (int i=1;i<=np;i++) cin>>names[i]; for (int i=1;i<=np;i++) { string temp; int tempr,tempg,j; cin>>temp; cin>>tempg>>j; for (int k=1;k<=j;k++) { string temp2; cin>>temp2; reci[temp2]+=tempg/j; given[temp]+=tempg/j; } } for (int i=1;i<=np;i++) cout<<names[i]<<" "<<reci[names[i]]-given[names[i]]<<endl; } return 0; }