Monday, March 26, 2012

Problem 77: Greedy Gift Givers

I failed 18 times due to division by zero, modulus of zero, etc.

This one is similar to "accounting". Create accounts for everyone, and change their amount of balance from each transaction. Then print everyone's final balances.

I used heap memory allocation, but that doesn't matter much. I just had to prevent null pointers from causing a crash.
/*
ID: victor4
PROG: gift1
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct account{
 string name;
 int money;
};

account *findAccount(string name, account *accounts, int max){
 for(int i = 0; i < max; ++i)
  if(accounts[i].name == name)
   return &accounts[i];
 return NULL;
}

int main() {
 ofstream fout ("gift1.out");
 ifstream fin ("gift1.in");
 
 int NP;
 fin >> NP;
 #define loopa for(int i = 0; i < NP; ++i)
 
 account *accounts = new account[NP];
 loopa{
  fin >> accounts[i].name;
  accounts[i].money = 0;
 }
 
 string in = "";
 while(fin >> in){
  account *giver = findAccount(in, accounts, NP);
  if(giver == NULL){
   fout << "invalid";
   return 1;
  }
  int amount, recv;
  fin >> amount >> recv;
  
  int each = recv ? (amount / recv) : 0;
  int extra = recv ? (amount % recv) : amount;
  giver->money += extra - amount;
  
  for(int j = 0; j < recv; ++j){
   fin >> in;
   account *reciever = findAccount(in, accounts, NP);
   if(reciever != NULL)
    reciever->money += each;
  }
 }
 
 loopa{
  fout << accounts[i].name << " " << accounts[i].money << endl;
 }
 
 delete[] accounts;
 
 return 0;
}

No comments:

Post a Comment