0

私は 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) の一意の名前を持つ友人のグループが、お金の贈り物を交換することにしました。これらの友人のそれぞれは、他の友人の一部またはすべてにいくらかのお金を与える場合と与えない場合があります。同様に、各友人は、他の友人のいずれかまたはすべてからお金を受け取る場合と受け取らない場合があります。この問題での目標は、各人が受け取った金額よりも多くの金額を提供したことを推測することです。

贈答のルールは、予想とは異なる可能性があります。各人は、贈るために一定の金額を取っておき、そのお金を贈る相手全員に均等に分けます。端数のお金は利用できないため、2 人の友人で 3 人を分割すると、残りの 1 人の友人に対してそれぞれ 1 になります。残りの 1 つは贈与者の「アカウント」に残ります。

どのグループの友人にも、他の人よりも寄付をする人がいます (または、少なくとも知り合いが多い) 人もいれば、他の人より多くのお金を持っている人もいます。

14 文字を超える名前のない友人のグループが与えられた場合、グループ内の各人がギフトに費やす金額と、各人がギフトを贈る友人の (サブ) リストから、どれだけ多く (または少ない)グループの各人は、受け取るよりも与える。

入力フォーマット 行 1: 単一の整数、NP 行 2..NP+1: 各行にはグループ メンバーの名前が含まれます 行 NP+2..end: 次のように編成された行の NP グループ: グループの最初の行は、プレゼントする人の名前。グループの 2 行目には 2 つの数値が含まれます。贈り主が贈答品に分割する最初の金額 (0 から 2000 の範囲) と、贈与者が贈答品を贈る人数 NGi (0 ≤ NGi ≤ NP-1)。NGi がゼロ以外の場合、次の各 NGi 行にはギフトの受取人の名前がリストされます。

4

1 に答える 1

0

USACO にはいかなる種類のデバッガーもないため、論理エラーを効果的にチェックできるかどうかはわかりませんが、コンパイル エラーはありません。

それがあなたの主な問題です。

デバッガーが利用可能な環境でこのコードを実行できますか? 無料で利用できる C++ 開発環境があります。デバッガーなしで C++ をコーディングすることはできません。StackOverflow は効率的なデバッガではありません;)

于 2012-11-17T02:10:00.563 に答える