我是 C++ 的初学者,最近我正在参加有关送礼的 USACO 培训计划。然而,虽然输出应该显示每个相关人员的姓名和他们各自的现金金额,但我的总是以全零结束。这是我的代码:
/*
ID: afuhrtr1
PROG: gift1
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <map>
using namespace std;
int main() {
stringstream ss;
ofstream fout ("gift1.out");
ifstream fin ("gift1.in");
int np;
fin >> np;
string people [np];
map<string, int> amounts;
for (int i = 0; i < np; i++)
{
string name;
fin >> name;
//amounts[name]=0;
people[i] = name;
}
while (fin.good())
{
string giver;
fin >> giver;
string twoNumbers;
fin >> twoNumbers;
int spacePos = twoNumbers.find(' ');
int amount;
ss << twoNumbers.substr(0, spacePos);
ss >> amount;
int npgiven;
ss << twoNumbers.substr(spacePos+1);
ss >> npgiven;
for (int i = 0; i < npgiven; i++)
{
string name;
fin >> name;
amounts[name]+=(amount/npgiven);
}
amounts[giver]+=(amount % npgiven - amount);
}
map<string, int>::iterator it;
for (int i = 0; i < np; i++)
fout << people[i] << " " << amounts[people[i]] << endl;
return 0;
}
我假设问题要么是为地图元素分配东西,要么是 fin.good() 调用。
另外,这是比赛场景:
一组 NP (2 ≤ NP ≤ 10) 个唯一命名的朋友决定交换金钱礼物。这些朋友中的每一个都可能会或可能不会给任何或所有其他朋友一些钱。同样,每个朋友可能会或可能不会从任何或所有其他朋友那里收到钱。你在这个问题中的目标是推断出每个人给的钱比他们得到的钱多。
送礼的规则可能与您预期的不同。每个人留出一定数量的钱来赠送,并将这笔钱平均分配给他或她正在赠送礼物的所有人。没有可用的小数钱,因此将 3 分给 2 个朋友,剩下 1 个的朋友各得 1 - 剩下的 1 个留在给予者的“帐户”中。
在任何一群朋友中,有些人比其他人付出更多(或者至少可能有更多的熟人),有些人比其他人有更多的钱。
给定一组朋友,其中没有一个人的名字超过 14 个字符,组中每个人花在礼物上的钱,以及每个人赠送礼物的朋友的(子)列表,确定还有多少(或少)小组中的每个人给予的比他们得到的多。
INPUT FORMAT 第 1 行:单个整数,NP 第 2..NP+1 行:每行包含一个组成员的名称 NP+2..end:NP 组的行组织如下:组中的第一行告诉将要送礼的人的姓名。该组中的第二行包含两个数字:送礼者分配礼物的初始金额(范围为 0..2000),然后是送礼者将送礼的人数 NGi (0 ≤ NGi ≤ NP-1)。如果 NGi 不为零,则接下来的每一行 NGi 都会列出礼物接受者的姓名。