Greedy Gift Givers

A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts of money. Each of these friends might or might not give some money to any or all of the other friends. Likewise, each friend might or might not receive money from any or all of the other friends. Your goal in this problem is to deduce how much more money each person gives than they receive.

The rules for gift-giving are potentially different than you might expect. Each person sets aside a certain amount of money to give and divides this money evenly among all those to whom he or she is giving a gift. No fractional money is available, so dividing 3 among 2 friends would be 1 each for the friends with 1 left over -- that 1 left over stays in the giver's "account".

In any group of friends, some people are more giving than others (or at least may have more acquaintances) and some people have more money than others.

Given a group of friends, no one of whom has a name longer than 14 characters, the money each person in the group spends on gifts, and a (sub)list of friends to whom each person gives gifts, determine how much more (or less) each person in the group gives than they receive.

IMPORTANT NOTE

The grader machine is a Linux machine that uses standard Unix conventions: end of line is a single character often known as '\n'. This differs from Windows, which ends lines with two charcters, '\n' and '\r'. Do not let your program get trapped by this!

PROGRAM NAME: gift1

INPUT FORMAT

Line 1: The single integer, NP
Lines 2..NP+1: Each line contains the name of a group member
Lines NP+2..end: NP groups of lines organized like this:

The first line in the group tells the person's name who will be giving gifts.
The second line in the group contains two numbers: The initial amount of money (in the range 0..2000) to be divided up into gifts by the giver and then the number of people to whom the giver will give gifts, NGi (0 ≤ NGi ≤ NP-1).
If NGi is nonzero, each of the next NGi lines lists the the name of a recipient of a gift.

SAMPLE INPUT (file gift1.in)

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

OUTPUT FORMAT

The output is NP lines, each with the name of a person followed by a single blank followed by the net gain or loss (final_money_value - initial_money_value) for that person. The names should be printed in the same order they appear on line 2 of the input.

All gifts are integers. Each person gives the same integer amount of money to each friend to whom any money is given, and gives as much as possible that meets this constraint. Any money not given is kept by the giver.

SAMPLE OUTPUT (file gift1.out)

dave 302
laura 66
owen -359
vick 141
amr -150
题解: n为人的名字个数
n个名字
接下来有n
--------------------
输入一个名字
输入要给的钱数 和 人数
要给的人的名字
---------------------
OK code:
 /*
ID: ******
PROG: gift1
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
typedef struct
{
char name[];
int receive;
}person;
person P[];
int find(char s[],int m)
{
int i;
for(i=;i<m;i++)
if(strcmp(P[i].name,s)==)
break;
return i;
} int main() {
ofstream fout ("gift1.out");
ifstream fin ("gift1.in"); char s[];
int m,n,t,i,v,g,f,j;
fin>>m;
for(i=;i<m;i++)
{
fin>>P[i].name;
P[i].receive=;
}
for(i=;i<m;i++)
{
fin>>s;
fin>>t>>v;
n=find(s,m);
P[n].receive-=t;
if(t== && v==) //要注意 0/0的情况,如果直接0/0 就会编译错误
f=;
else if(t%v== )
f=t/v;
else if(t%v!=)
{
g=t-(t%v);
f=g/v;
P[n].receive+=(t%v);
}
for(j=;j<v;j++)
{
fin>>s;
n=find(s,m);
P[n].receive+=f;
}
}
for(i=;i<m;i++)
fout<<P[i].name<<" "<<P[i].receive<<endl;
return ;
}

官方代码:

#include <stdio.h>
#include <string.h>
#include <assert.h> #define MAXPEOPLE 10
#define NAMELEN 32 typedef struct Person Person;
struct Person {
char name[NAMELEN];
int total;
}; Person people[MAXPEOPLE];
int npeople; void
addperson(char *name)
{
assert(npeople < MAXPEOPLE);
strcpy(people[npeople].name, name);
npeople++;
} Person*
lookup(char *name)
{
int i; /* look for name in people table */
for(i=; i<npeople; i++)
if(strcmp(name, people[i].name) == )
return &people[i]; assert(); /* should have found name */
} int
main(void)
{
char name[NAMELEN];
FILE *fin, *fout;
int i, j, np, amt, ng;
Person *giver, *receiver; fin = fopen("gift1.in", "r");
fout = fopen("gift1.out", "w"); fscanf(fin, "%d", &np);
assert(np <= MAXPEOPLE); for(i=; i<np; i++) {
fscanf(fin, "%s", name);
addperson(name);
} /* process gift lines */
for(i=; i<np; i++) {
fscanf(fin, "%s %d %d", name, &amt, &ng);
giver = lookup(name); for(j=; j<ng; j++) {
fscanf(fin, "%s", name);
receiver = lookup(name);
giver->total -= amt/ng;
receiver->total += amt/ng;
}
} /* print gift totals */
for(i=; i<np; i++)
fprintf(fout, "%s %d\n", people[i].name, people[i].total);
exit ();
}

===================测试数据===============================

------- test 1 ----
10 mitnik Poulsen Tanner Stallman Ritchie Baran Spafford Farmer Venema Linus mitnik 300 3 Poulsen Tanner Baran Poulsen 1000 1 Tanner Spafford 2000 9 mitnik Poulsen Tanner Stallman Ritchie Baran Farmer Venema Linus Tanner 1234 1 Poulsen Stallman 536 3 Farmer Venema Linus Ritchie 2000 1 mitnik Baran 79 2 Tanner Farmer Farmer 0 0 Venema 12 9 mitnik Poulsen Tanner Stallman Ritchie Baran Spafford Farmer Linus Linus 1000 1 mitnik ------- test 2 ----
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 ------- test 3 ----
2 john lennon lennon 0 0 john 0 0 ------- test 4 ----
10 Alex Bob Catherine Dave Ebert Francis Godot Harris Iliya Jimbo Alex 2000 9 Bob Catherine Dave Ebert Francis Godot Harris Iliya Jimbo Bob 2000 9 Alex Catherine Dave Ebert Francis Godot Harris Iliya Jimbo Catherine 2000 9 Alex Bob Dave Ebert Francis Godot Harris Iliya Jimbo Dave 2000 9 Alex Bob Catherine Ebert Francis Godot Harris Iliya Jimbo Ebert 2000 9 Alex Bob Catherine Dave Francis Godot Harris Iliya Jimbo Francis 2000 9 Alex Bob Catherine Dave Ebert Godot Harris Iliya Jimbo Godot 2000 9 Alex Bob Catherine Dave Ebert Francis Harris Iliya Jimbo Harris 2000 9 Alex Bob Catherine Dave Ebert Francis Godot Iliya Jimbo Iliya 2000 9 Alex Bob Catherine Dave Ebert Francis Godot Harris Jimbo Jimbo 2000 9 Alex Bob Catherine Dave Ebert Francis Godot Harris Iliya ------- test 5 ----
4 these names are dumb dumb 534 3 these dumb are are 351 1 names these 509 2 dumb names names 278 1 dumb ------- test 6 ----
2 someguy someotherguy someotherguy 1500 1 someguy someguy 500 1 someotherguy ------- test 7 ----
8 a b c d e f g h c 500 4 a b d h f 290 3 a b c a 489 7 b c d e f h g g 0 0 e 1789 2 f h d 2000 5 a b h f e b 192 5 a c h g d h 0 2 a b ------- test 8 ----
10 paul stan mark doug fred bill hank rich mike john paul 0 0 john 300 2 paul stan stan 1000 1 paul mark 2000 3 paul stan doug doug 510 2 paul stan fred 1560 2 paul stan bill 178 2 paul stan hank 97 2 paul stan rich 1999 2 paul stan mike 1531 2 paul stan ------- test 9 ----
10 paul stan mark doug fred bill hank rich mike john paul 1693 6 stan mark doug fred bill hank john 1843 3 hank mike paul stan 1346 9 paul mark fred bill doug hank rich mike john mark 1657 1 paul doug 1256 9 paul stan bill mark fred rich hank mike john fred 1250 6 paul stan bill rich john mike bill 1999 2 john mike hank 2000 8 stan mark doug fred rich bill mike john rich 1999 3 paul bill hank mike 1999 5 hank bill mark rich john

Keep up the good work!

Greedy Gift Givers的更多相关文章

  1. USACO . Greedy Gift Givers

    Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...

  2. 119 - Greedy Gift Givers

     Greedy Gift Givers  The Problem This problem involves determining, for a group of gift-giving frien ...

  3. USACO Section 1.1-2 Greedy Gift Givers

    Greedy Gift Givers 贪婪的送礼者 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那 ...

  4. Section 1.1 Greedy Gift Givers

    Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends hasdecided to exchange gifts o ...

  5. 1.1.4 PROB Greedy Gift Givers

    Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...

  6. 洛谷 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers

    贪婪的送礼者Greedy Gift Givers 难度:☆ Code: #include <iostream> #include <cstdio> #include <c ...

  7. usaco training <1.2 Greedy Gift Givers>

    题面 Task 'gift1': Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided t ...

  8. Greedy Gift Givers 贪婪的送礼者 USACO 模拟

    1002: 1.1.2 Greedy Gift Givers 贪婪的送礼者 时间限制: 1 Sec  内存限制: 128 MB提交: 9  解决: 9[提交] [状态] [讨论版] [命题人:外部导入 ...

  9. USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers

    P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers 题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一 ...

随机推荐

  1. 一、小程序连接MySql数据库

    前言:我用的是wafer2 node.解决方案 下面连接有环境配置及搭建流程(https://github.com/tencentyun/wafer2-quickstart-nodejs) ,连接是官 ...

  2. 详解MessageBox(),MsgBox函数的正确使用

    //或者使用chr(13),chr(10)效果一样 MsgBox "a"&chr(13)&"b"&chr(10)&"c ...

  3. linux mysql5.7 安装、 开机启动

    一.安装 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz h ...

  4. dom技术解析xml下jaxp解析器详细代码

    1.使用jaxp实现查询操作 person.xml <?xml version="1.0" encoding="UTF-8" standalone=&qu ...

  5. pycharm快捷键一览

    编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctrl + P ...

  6. sql语句(Oracle和sqlserver)

    查询表的首句:(Oracle) select * from (select a.*, rownum as rn from tab_name a order by col )where rn = 1 o ...

  7. linux下,把屏幕竖起来

    xrandr -o left 向左旋转90度 xrandr -o right 向右旋转90度 xrandr -o inverted 上下翻转 xrandr -o normal 回到正常角度

  8. 16 Django-admin管理工具

      admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...

  9. 3226: [Sdoi2008]校门外的区间

    链接 思路 bug漫天飞... 维护一颗线段树,支持区间赋值,和区间异或.因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下. U ...

  10. C#冒泡算法复习

    C#冒泡算法复习 冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比 ...