【USACO TRAINING】贪婪的送礼者【原创】

题目描述

对于一群要互送礼物(钱)的朋友,你要确定每个人送出的礼物(钱)比收到的多多少。

在这一个问题中,每个人都准备了一些钱作为礼物送给朋友,而这些钱将会被平均分给那些将收到他的礼物的人(但是除不尽的余数不送)。

显然,在一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人将收到较多的礼物。

给出一群朋友, 没有人的名字会长于14个字符,给出每个人将用来送礼的钱,和将收到他的礼物的人的列表,请确定每个人收到的比送出的钱多的数目。

输入

第1行: 总人数NP,2<= NP<=10

第2..NP+1 行: 这NP个人的名字,一个名字一行,长度不超过14个字符

第NP+2到最后: 这里的NP段内容是这样组织的:

第1行:送出礼物的人的姓名。

第2行:2个数字: 第一个是初始的钱的数目(在0到2000的范围里),第二个NGi是将收到这个送礼者礼物的人数。如果 NGi 是非零的,在下面 NGi 行列出礼物的接受者的名字,一个名字一行。

输出

输出 NP 行 每行是一个的名字加上空格再加上收到的比送出的钱多的数目。

对于每一个人,他名字的打印顺序应和他在输入的2到NP+1行中输入的顺序相同。所有的送礼的钱都是整数。

每个人把相同数目的钱给每位要送礼的朋友,而且尽可能多给,不能给出的钱被送礼者自己保留。

样例输入

5
dave
laura
owen
vick
amr
dave
200 3
l aura
owen
vick
owen
500 1
dave
amr
150 2
vick
owen
laura
0 2
amr
vick
vick
0 0

样例输出

dave 302l
aura 66
owen -359
vick 141
amr -150
类型: 模拟 字符串处理
这种水题就不用细细描述了……(~ o ~)Y(~ o ~)Y(~ o ~)Y(~ o ~)Y
code:
#include<cstdio>
#include<cstring>
int money[10];
int Judge(char *a,char b[][14],int n){
    int i;
    for(i=0;i<n;i++)
        if(!strcmp(a,b[i]))
            return i;
}
int main()
{
    int n,i,m,j,g,k,p;
    char a[10][14],b[14];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%s",a[i]);
    for(p=0;p<n;p++,memset(b,0,sizeof(b))){
        scanf("%s%d%d",b,&k,&m);
        if(!m)
            continue;
        g=k/m;
        money[Judge(b,a,n)]-=m*g;
        for(j=0;j<m;j++){
            scanf("%s",b);
            money[Judge(b,a,n)]+=g;
        }
    }
    for(i=0;i<n;i++)
        printf("%s %d\n",a[i],money[i]);
}


你可能感兴趣的:(C++,USACO,iostream)