2012-11-17 3 views
0

저는 C++의 초보자이며 최근에는 선물 제공에 관한 USACO 교육 프로그램을 진행하고있었습니다. 그러나 산출물에는 관련된 모든 사람의 이름과 각각의 현금 금액이 나와야하는데, 광산은 항상 모두 0으로 끝납니다. 여기 내 코드는 다음과 같습니다.지도의 지정이 0으로 끝나나요?

/* 
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; 
} 

지도 요소에 stuff 또는 fin.good() 호출을 할당하는 것으로 가정합니다.

NP의 그룹 (2 ≤ 순이익 ≤ 10) 고유 한 이름의 친구가 돈 선물을 교환하기로 결정했다 :

또한, 여기에 대회 시나리오입니다. 이 친구들 각각은 다른 친구들의 일부 또는 전부에게 돈을 줄 수도 있고 아닐 수도 있습니다. 마찬가지로 각 친구는 다른 친구의 일부 또는 전체로부터 돈을받을 수도 있고받지 못할 수도 있습니다. 이 문제의 목표는 각 사람이받는 돈보다 얼마나 많은 돈을 추론하는 것입니다.

선물 제공 규칙은 예상했던 것보다 약간 다를 수 있습니다. 각 사람은 선물을주고있는 모든 사람에게이 돈을 균등하게 분배하기 위해 일정 금액의 돈을 따로 마련합니다. 분수돈은 없습니다. 따라서 2 명의 친구 중 3 명을 나누는 것은 남은 1 명이있는 친구에 대해 각각 1 명이됩니다. 남은 1 명이 기부자의 "계좌"에 남게됩니다.

어떤 친구 그룹에서 어떤 사람들은 다른 사람들보다 더 많이 (또는 적어도 더 많은 지인이있을 수 있음), 어떤 사람들은 다른 사람들보다 돈이 많습니다.

14 명 이상의 이름을 가진 친구 그룹이 없으면 그룹의 각자가 선물에 소비하는 돈과 각 사람이 선물을주는 친구 목록이 어떻게 결정되는지 그룹의 각 개인이받은 것보다 훨씬 더 (또는 적게) 제공됩니다.

FORMAT 1 호선

INPUT : 단일 정수, NP 라인 2..NP + 1 : 각 행은 그룹 구성원의 이름을 포함 라인 NP + 2..end이 같은 조직 라인의 NP 그룹 : 그룹의 첫 번째 행은 선물을 줄 사람의 이름을 알려줍니다. 그룹의 두 번째 줄에 두 개의 숫자가 있습니다 : 기부자가 선물로 나눌 초기 금액 (범위 : 0..2000)과 기부자가 선물을 줄 사람 수 NGi 0 ≤ NGi ≤ NP-1). NGi가 0이 아닌 경우 다음 NGi 행에 선물 수신자의 이름이 나열됩니다.

+4

정수를 정수로 나눈 값이 원하는 값이 아닐 수 있습니다. – ildjarn

+0

오류를 확인하지 않으므로 성공적으로 읽었 음을 어떻게 확신 할 수 있습니까? 또한 VLA는 C++이 아닙니다. – chris

+0

금액은 항상 npgiven보다 훨씬 클 것이고 division은 고르지 않아야하기 때문에 int/int를 원한다고 생각합니다. USACO에는 디버거가 없으므로 논리 오류를 효과적으로 확인할 수는 없지만 컴파일러 오류는 없습니다. 또한이 VLA는 어디에 있습니까? – aftrumpet

답변

0

USACO에는 디버거가 없으므로 논리 오류를 효과적으로 확인할 수 있지만 컴파일러 오류는 없습니다.

이것이 주된 문제입니다.

디버거를 사용할 수있는 환경에서이 코드를 실행할 수 있습니까? 자유롭게 사용할 수있는 C++ 개발 환경이 있습니다. 디버거없이 C++를 코딩 할 수 없습니다. StackOverflow는 효율적인 디버거가 아닙니다.)

+0

글쎄, 나는 Code :: Blocks를 설치했다. 그러나 컴파일러 경로가 제대로 설정되지 않아서 아무 것도 실행할 수 없다. – aftrumpet

+0

디버깅 할 수 없다면 printf & cout은 친구입니다;) –