We can rephrase the problem as finding an integer $h$ such that the number of cows who provided information inconsistent with Bessie hiding at $h$ is minimized. For the first sample input, any $h$ satisfying $3\le h\le 5$ is consistent with there being zero liars. For the second sample input, any $h$ satisfying $h\le 1$ or $h\ge 2$ is consistent with there being a single liar.
Of course, we don't have time to try all possible values of $h$. We can reduce the number of $h$ we need to consider by observing that if we move $h$ leftwards or rightward until it equals one of the $p_i$ provided in the input, the number of cows that are inconsistent with $h$ either stays the same or decreases. For example, consider the first sample input:
So it suffices to only consider the case when $h=p_i$ for some $i$. That is,
For a single value of $h$, we can count the number of cows inconsistent with $h$ in $O(N)$ time by looping over all cows in the input. So the overall time complexity is $O(N^2)$.
Danny Mittal's code:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class CountingLiarsQuadratic { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine()); Information[] infos = new Information[n]; for (int j = 0; j < n; j++) { StringTokenizer tokenizer = new StringTokenizer(in.readLine()); char direction = tokenizer.nextToken().charAt(0); int reference = Integer.parseInt(tokenizer.nextToken()); infos[j] = new Information(direction, reference); } int answer = n; for (Information tight : infos) { int x = tight.reference; int liars = 0; for (Information info : infos) { if (info.direction == 'G' ? x < info.reference : x > info.reference) { liars++; } } answer = Math.min(answer, liars); } System.out.println(answer); } public static class Information { public final char direction; public final int reference; public Information(char direction, int reference) { this.direction = direction; this.reference = reference; } } }
Jichao Qian's code:
#include <stdio.h> #include <stdint.h> #include <vector> #include <algorithm> using namespace std; int main() { int N; scanf("%d", &N); vector<pair<int, int>> locations(N); for (int idx = 0; idx < N; ++idx) { char dir[10]; scanf("%s", dir); scanf("%d", &locations[idx].first); if (dir[0] == 'G') locations[idx].second = -1; else locations[idx].second = +1; } int minLiars = N; sort(locations.begin(), locations.end()); for (int idx = 0; idx < N; ++idx) { int numLiars = 0; for (int jdx = 0; jdx < idx; ++jdx) if (locations[jdx].second == 1) ++numLiars; for (int jdx = idx+1; jdx < N; ++jdx) if (locations[jdx].second == -1) ++numLiars; minLiars = min(numLiars, minLiars); } printf("%d\n", minLiars); }
Bonus: Solve the problem in $O(N\log N)$ time.