My code for solving this problem is below (in C++, but if you speak Java or Python it should hopefully still be easy to follow). I first wrote a helper function target(i) that computes to whom cow i passes the ball. Using this, I count for each cow i the number of cows passing to her. If this number is zero, the cow is a "source" -- she passes the ball away but never gets a ball back. Such cows all need their own starting ball from Farmer John.

The only other special case where Farmer John needs to distribute a ball initially is to a pair of adjacent cows that both pass to each-other, and where neither receives a pass from anyone else, so this pair is isolated from the rest of the game.

#include <iostream> #include <fstream> using namespace std; int N, x[100], passto[100]; // passto[i] is # of cows passing to cow i // To whom does cow i pass the ball? int target(int i) { int left_nbr=-1, left_dist = 1000; int right_nbr=-1, right_dist = 1000; // Find closet neighbors on left and right for (int j=0; j<N; j++) if (x[j] < x[i] && x[i]-x[j] < left_dist) { left_nbr = j; left_dist = x[i]-x[j]; } for (int j=0; j<N; j++) if (x[j] > x[i] && x[j]-x[i] < right_dist) { right_nbr = j; right_dist = x[j]-x[i]; } if (left_dist <= right_dist) return left_nbr; return right_nbr; } int main(void) { ifstream fin ("hoofball.in"); ofstream fout ("hoofball.out"); fin >> N; for (int i=0; i<N; i++) fin >> x[i]; for (int i=0; i<N; i++) passto[target(i)]++; int answer = 0; for (int i=0; i<N; i++) { if (passto[i] == 0) answer++; // +1 for every "source" cow, to whom nobody passes if (i < target(i) && target(target(i))==i && passto[i]==1 && passto[target(i)]==1) answer++; // +1 for every pair passing to each-other } fout << answer << "\n"; return 0; }