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. 【PGP公钥】

    Fingerprint: 37AF 3814 3ABC 5DFA 97F5 300E 581D A2E3 F4D2 F585 Key ID:0x581DA2E3F4D2F585 -----BEGIN ...

  2. JZOJ 1738. Heatwave

    Description 给你N个点的无向连通图,图中有M条边,第j条边的长度为: d_j. 现在有 K个询问. 每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少? I ...

  3. 千锋教育Vue组件--vue基础的方法

    课程地址: https://ke.qq.com/course/251029#term_id=100295989 <!DOCTYPE html> <html> <head& ...

  4. 1014-31-首页12-显示weibo未读数--后台运行---定时器

    /** *  当app进入后台时调用 */- (void)applicationDidEnterBackground:(UIApplication *)application{    /**     ...

  5. [BZOJ1045] [HAOI2008] 糖果传递 (中位数)

    Description 题目链接 Solution 这题跟数列的中位数有关, 具体证明见刘汝佳的蓝皮书里 Code #include <cstdio> #include <algor ...

  6. Git Cheatshell - Pro Git

    A git cheatshell based on the book: http://www.git-scm.com/book/en/v2. Repository Configuration git ...

  7. Android面试收集录17 Android进程优先级

    在安卓系统中:当系统内存不足时,Android系统将根据进程的优先级选择杀死一些不太重要的进程,优先级低的先杀死.进程优先级从高到低如下. 前台进程 处于正在与用户交互的activity 与前台act ...

  8. hadoop,hbase,hive

    linux上安装hadoop,然后安装hbase,然后安装zookeeper,最后安装hive.hbase安装在hdfs下.hive是纯逻辑表,hbase是物理表.hdfs是hadoop上的一个组件.

  9. .Net Mvc 4 Route路由

    1.前言 在创建一个MVC项目后就可以,在App_Start文件下的RouteConfig.cs里面就可以定义我们的路由规则,其中已经有默认的路由规则了,routes.IgnoreRoute是让路由规 ...

  10. 局域网&广域网&Internet&计算机通信过程

    1.局域网 覆盖范围小(100m以内),自己花钱购买,自己单位来维护,带宽固定的(10M,100M,1000M) 2.Internet ISP,有自己的机房,对网民提供访问Internet连接 3.广 ...