题目
贪婪的礼物送礼者
对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for those who view gift giving with cynicism). 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物 的人. 然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较 多的钱. 给出一群朋友, 没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物 的人的列表, 请确定每个人收到的比送出的钱多的数目.
题解
模拟
代码
/*
ID: yjy_aii1
TASK: gift1
LANG: C++
*/
#include <cstdio>
#include <cstring>
using namespace std;
int n,a[15];
int c[15];
char cd[15][300];
int name(){
for (int i=1;i<=n;i++)
if (c[0]==c[i]) return i;
}
void read(int k){
char cch;
c[k]=0;
int le=0;
cch=getchar();
while ((cch<'a'||cch>'z')&&(cch<'A'||cch>'Z')) cch=getchar();
while ((cch>='a'&&cch<='z')||(cch>='A'&&cch<='Z')) {
cd[k][le]=cch;
le++;
c[k]=c[k]*26+cch-'a';
cch=getchar();
}
}
int main(){
freopen("gift1.in","r",stdin);
freopen("gift1.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++){
read(i);
}
for (int i=1;i<=n;i++){
read(0);
int k=name(),m,t;
scanf("%d%d",&m,&t);
if (t>0&&m>0){
a[k]+=m%t-m;
m/=t;
for (int j=1;j<=t;j++){
read(0);
a[name()]+=m;
}
} else a[k]+=m;
}
for (int i=1;i<=n;i++){
printf("%s %d\n",cd[i],a[i]);
}
fclose(stdin);
fclose(stdout);
}