Tuesday, December 18, 2012

December 2012 Bronze Problem 1: Meet and Greet

Result: 10/10 **********

greetings.cpp
#include <iostream>
#include <fstream>
#include <string>
 
#define loopi(x) loop_start(i,x,0)
#define loopj(x) loop_start(j,x,0)
#define loop_start(i, x,s) for(int i = (s); i < (x); ++i)
#define loop_rev(a,x,stop) for(int a = (x); a >= (stop); --a)
 
using namespace std;

// a linked list of steps
/* I originally used a linked list, but I changed my idea
struct step {
 int move;
 step *next;
 step(int move) : move(move), next(NULL) {}
};
*/

int main() {
 ofstream fout ("greetings.out");
 ifstream fin ("greetings.in");
 // get input
 unsigned short B, E;
 fin >> B >> E;
 //int deltas[1000000] = { 0 };
 int *deltas = new int[1000000]; // it will end up as the difference in position between the two cows
 memset(deltas, 0, 1000000*sizeof(int));
 // get more input
 int pos = 0, total_b = 0, total_e = 0;
 loopi(B){ // fill with current position of B
  int num;
  char direction;
  fin >> num >> direction;
  loopj(num){
   deltas[pos] = (direction == 'R' ? -1 : 1);
   ++pos;
  }
 }
 total_b = pos;
 pos = 0;
 loopi(E){
  int num;
  char direction;
  fin >> num >> direction;
  loopj(num){
   deltas[pos] += (pos ? deltas[pos - 1] : 0) - (direction == 'R' ? -1 : 1);
   ++pos;
  }
 }
 total_e = pos;
 loop_start(i, total_b, total_e){
  deltas[i] += deltas[i - 1];
 }
 // process
 int meetings = 0;
 int total = total_e > total_b ? total_e : total_b;
 bool canmeet = false;
 loopi(total){
  if(!deltas[i]){
   if(canmeet){
    ++meetings;
    canmeet = false;
   }
  }
  else canmeet = true;
 }
 // output
 fout << meetings << endl;
 // cleanup
 fin.close();
 fout.close();
 delete[] deltas;
 return 0;
}

No comments:

Post a Comment