题目 2001

usaco-1.1.2 贪婪的礼物送礼者

题号
2001
时间限制
1000 ms
内存限制
134217728 MB
标签
模拟字符串

题目描述

毛毛有一群好朋友,现在他们需要互相赠送金钱.他们按下面的规则去互相送钱.你需要最后算出来每个人最后手里的钱的数量.具体的描述看下面

输入入格式

  • 第 1 行:人数nn,n20n \leqslant 20,表示有多少个人相互赠送金钱
  • 第 2 到 n+1 行:这 N 个的名字,每个名字的长度不超过14
  • 第 N+2 行一直到文件的末尾:数据是这样的
    • 第一行是将会送出钱人的名字
    • 第二行包含2个数字:
      • 第一个数字,m,送钱人需要送出的钱的数目(在 0 到 2000 的范围内)
      • 第二个数字,cnt,是将收到这个送礼者礼物的人的个数,如果这个数字是非零的, 在下面 cnt 行列出接受者的名字,一个名字一行.

输入样例

文本
5
maomao
laura
owen
vick
amr
maomao
200 3
laura
owen
vick
owen
500 1
maomao
amr
150 2
vick
owen
laura
0 2
amr
vick
vick
0 0

输出格式

输出 N 行

每行是一个的名字加上空格再加上最后手上的钱的数量.如果送出的钱比得到的钱多,你应该输出一个负值,表明多多少.否则输出正值

注意这个输出的顺序和读取的人的顺序是一样的

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

样例输出

文本
maomao 302
laura 66
owen -359
vick 141
amr -150

hint 1

整个送钱的过程如下表格

文本
刚开始,每个人都没有钱,每个的钱为0

+--------+-------+------+------+-----+
| maomao | laura | owen | vick | amr |
+--------+-------+------+------+-----+
|    0   |   0   |   0  |   0  |  0  |
+--------+-------+------+------+-----+

maomao
200 3
laura
owen
vick

maomao送200钱,给3个人,每个人得到 200/3 = 66
剩余2元钱maomao自己拿着
maomao的手上的钱就应该是-200+2 = -198
+--------+-------+------+------+-----+
| maomao | laura | owen | vick | amr |
+--------+-------+------+------+-----+
|  -198  |   66  |  66  |  66  |  0  |
+--------+-------+------+------+-----+

owen
500 1
maomao
+--------+-------+------+------+-----+
| maomao | laura | owen | vick | amr |
+--------+-------+------+------+-----+
|   302  |   66  | -434 |  66  |  0  |
+--------+-------+------+------+-----+

amr
150 2
vick
owen
+--------+-------+------+------+------+
| maomao | laura | owen | vick | amr  |
+--------+-------+------+------+------+
|   302  |   66  | -359 | 141  | -150 |
+--------+-------+------+------+------+


vick
0 0
+--------+-------+------+------+------+
| maomao | laura | owen | vick | amr  |
+--------+-------+------+------+------+
|   302  |   66  | -359 | 141  | -150 |
+--------+-------+------+------+------+

hint 2

如何判断整个文件的数据读取完毕了呢?

比如有一个in文件的数据如下

文本
1 2 32 3

我们不知道具体有多少数据,怎么知道能把所有的数据读取完毕了呢?

cpp
#include <iostream>
using namespace std;
int main() {
  while( 1) {
    int t;
    cin >> t;
    cout << t <<endl;

    //检查是否达到文件的末尾
    // eof = end of file 
    // 如果 cin.eof() 返回true,就表示达到了文件的末尾
    if( cin.eof()) break;

  }
  return 0;
}

运行,代码会在读取所的数据读取完毕后,结果.

bash
./1< in

cin.eof() 是 C++ 中的一个函数,用于检查输入流 cin 是否已经到达文件末尾 (EOF)。当 cin 到达文件末尾时,cin.eof() 返回 true;否则返回 false。

在使用时,通常会在读取输入之后立即检查 cin.eof() 的返回值,以确保没有尝试读取到文件末尾之后的无效数据。