/* Topcoder SRM 700, D1, 300-Pointer (FindingFriend) * James S. Plank * Wed Oct 26 11:16:37 EDT 2016 */ #include #include #include #include #include using namespace std; class FindingFriend { public: int find(int roomSize, vector leaders, int friendPlace); }; int FindingFriend::find(int roomSize, vector leaders, int friendPlace) { /* These are the three variables described in the writeup. */ int r; int leftover; int rooms; /* The first step is sorting, and checking to make return one when friendPlace equals one of the leaders. */ sort(leaders.begin(), leaders.end()); for (r = 0; r < leaders.size(); r++) { if (friendPlace == leaders[r]) return 1; } /* We set r, leftover and rooms before we start our main algorithm. */ r = 0; leftover = 0; rooms = 0; while (1) { /* First step -- increment r, and if our loop is done, return (rooms+1). */ r++; if (r == leaders.size()) return rooms+1; /* Now, we're adding the number of available contestant slots from room r-1 into leftover, and incrementing rooms to reflect adding room r-1 */ leftover += (roomSize-1); rooms++; /* If friendPlace is less than the leader for room r, then your friend has to go into one of the previous rooms. Return rooms. */ if (friendPlace < leaders[r]) return rooms; /* Decrement leftover by the number of contestants that must go into a room less than r. If that number is now zero, then we need to set rooms to zero, because there are no slots left in any of those rooms. */ leftover -= (leaders[r]-leaders[r-1]-1); if (leftover == 0) rooms = 0; } return 0; /* Shut the compiler up. */ }