usaco 1-1-2 Greedy Gift Givers

来源:互联网 发布:心动网络面试题 编辑:程序博客网 时间:2024/05/23 22:32

usaco 持续更新中。


nocow友情翻译:

描述

对于一群NP(2<=NP<=10)个要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少。 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。 然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。 给出一群朋友,没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表, 请确定每个人收到的比送出的钱多的数目。

[编辑]格式

PROGRAM NAME: gift1

INPUT FORMAT:

(file gift1.in)

  • 第 1 行: 人数NP,2<= NP<=10
  • 第 2 行 到 第NP+1 行:这NP个在组里人的名字 一个名字一行
  • 第NP+2到最后:

这里的I段内容是这样组织的:

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

OUTPUT FORMAT:

(file gift1.out)

输出 NP 行

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

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

每个人把相同数目的钱给每位要接受礼物的朋友,而且尽可能多给,不能给出的钱(即无法被整除的钱)由送礼者本人持有。

[编辑]SAMPLE INPUT

5davelauraowenvickamrdave200 3lauraowenvickowen500 1daveamr150 2vickowenlaura0 2amrvickvick0 0

[编辑]SAMPLE OUTPUT

dave 302laura 66owen -359vick 141amr -150


分析:此题也是字符串处理,因为每次都需找人的名字,需有strcmp这函数来进行查找(不熟的同学问度娘吧),然后弄几个数组记录钱即可!

上代码

/*ID:jwb11931LANG:C++TASK:gift1*/#include<stdio.h>#include<string.h>#include<stdlib.h>char a[100][100],b[100],x[100];int c[100][2],d[100];int main(){int i,j,n,w,k,m;freopen("gift1.in","r",stdin);freopen("gift1.out","w",stdout);scanf("%d",&n);for(i=0;i<n;i++){//字符串都从零开始,注意scanf("%s",a[i]);}for(i=0;i<n;i++){j=0;w=0;scanf("%s",b);while(strcmp(a[j],b))j++;//每次都得找到他,才能修改。如果a[j]相当于b串,strcmp函数会返回1,此时while终止,于是找到。scanf("%d %d",&c[j][0],&c[j][1]);if(c[j][1]!=0){w=c[j][0]/c[j][1];d[j]+=c[j][0]-w*c[j][1];for(k=0;k<c[j][1];k++){m=0;scanf("%s",x);while(strcmp(a[m],x))m++;d[m]+=w;}}}for(i=0;i<n;i++){printf("%s %d\n",a[i],d[i]-c[i][0]);}return 0;}


1 0
原创粉丝点击