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. Win10上Anaconda环境下python3.6安装和使用pyinstaller

    一.安装步骤 1. 电脑是win10,安装的Python3.6 2. 在Scripts文件夹下执行pip install pyinstaller, 安装成功后下载pyinstaller安装包,解压之后 ...

  2. python核心编程2 第八章 练习

    8–2. 循环. 编写一个程序, 让用户输入三个数字: (f)rom, (t)o, 和 (i)ncrement . 以 i为步长, 从 f 计数到 t , 包括 f 和 t . 例如, 如果输入的是 ...

  3. redis操作帮助类

    RedisHelper.java import redis.clients.jedis.*; import java.util.*; public class RedisHelper { privat ...

  4. vue学习--Props

    Props:        props用以从父组件接收数据:                     使用:                Vue.component('child',{        ...

  5. ethereum(以太坊)(二)--合约中属性和行为的访问权限

    pragma solidity ^0.4.0; contract Test{ /* 属性的访问权限 priveta public internal defualt internal interlnal ...

  6. Python文件IO(普通文件读写)

    ## 打开一个文件 - fileobj = open(filename, mode) 其中: fileobj是open()返回的文件对象 filename是该文件的字符串名 mode是指明文件类型和操 ...

  7. ln -s 软链接产生Too many levels of symbolic links错误

    不能使用相对路径, ln -s ./cmake /usr/bin/ 而是要 ln -s /usr/local/bin/cmake /usr/bin/

  8. Android Html处理器通用类 HtmlUtil

    1.整体分析 1.1.首先看一下源代码,可以直接Copy. public class HtmlUtil { /** * 获取 html 中的纯文本 */ public static String Ht ...

  9. FCS校验 C语言简单实现

    static uint8 calcFCS(uint8 *pBuf, uint8 len){  uint8 rtrn = 0;  while (len--)  {    rtrn ^= *pBuf++; ...

  10. Java线程---简介

    实现方式 在java中线程有两种实现方式: 1.继承thread类 2.实现runnable接口 Thread类 Thread类时在java.lang包中定义的,继承thread类必须重写run()方 ...