B - 欠けたアンケートとチーム分け / Missing Survey and Team Division 解説 by admin
Claude 4.6 Opus (Thinking)Overview
Given survey results for \(N\) people consisting of R, W, and ?, the problem asks to replace each ? with either R or W to minimize the absolute difference in the number of people on the red team and the white team.
Analysis
Key Observation
First, let’s organize the known information.
- Let \(r\) be the count of
R, \(w\) be the count ofW, and \(q\) be the count of?. - Each of the \(q\)
?characters is assigned to eitherRorW.
If we assign \(x\) of the ? characters to R and the remaining \(q - x\) to W, the final difference in team sizes becomes:
\[\text{Red team} - \text{White team} = (r + x) - (w + q - x) = (r - w) + 2x - q\]
Therefore, what we want to minimize is \(|(r - w) - q + 2x|\), where \(x\) is an integer satisfying \(0 \leq x \leq q\).
Comparison with a Brute-Force Approach
Iterating \(x\) from \(0\) to \(q\) takes \(O(q)\), and since \(q\) is at most around \(10^5\), this is fast enough. However, by mathematically computing the optimal \(x\) directly, we can solve it in \(O(1)\).
Mathematical Solution
Let \(f(x) = (r - w) - q + 2x\). The value of \(x\) that makes \(f(x) = 0\) is:
\[x = \frac{q - (r - w)}{2}\]
If this \(x\) is an integer and within the range \([0, q]\), the answer is \(0\). Otherwise, compute \(|f(x)|\) using the integer closest to the ideal value of \(x\) (clamped to the range \([0, q]\)).
Concrete Examples
- For \(r = 3, w = 1, q = 2\): \(f(x) = 3 - 1 - 2 + 2x = 2x\). Minimum value is \(0\) at \(x = 0\).
- For \(r = 3, w = 1, q = 1\): \(f(x) = 3 - 1 - 1 + 2x = 1 + 2x\). Minimum value is \(1\) at \(x = 0\).
Algorithm
- Read the input and count \(r\) (number of
R), \(w\) (number ofW), and \(q\) (number of?). - Let \(\text{diff} = r - w\).
- Find \(x \in [0, q]\) that minimizes \(|(r-w) - q + 2x|\).
- Compute the ideal value \(x^* = \frac{q - \text{diff}}{2}\).
- If \(x^*\) is an integer and \(0 \leq x^* \leq q\), the answer is \(0\).
- Otherwise, clamp the integers around \(x^*\) (\(\lfloor x^* \rfloor\) and \(\lceil x^* \rceil\)) to the range \([0, q]\), and output the smaller of the two \(|f(x)|\) values.
Complexity
- Time complexity: \(O(N)\) (\(O(N)\) for reading the input, \(O(1)\) for computing the optimal solution)
- Space complexity: \(O(1)\) (only counter variables)
Implementation Notes
Whether \(x^*\) is an integer can be determined by checking if \((q - \text{diff})\) is even. If \((q - \text{diff})\) is odd, then \(f(x)\) always takes odd values, so the answer cannot be \(0\).
When computing \(\lfloor x^* \rfloor\) using
int(), if \(x^*\) is negative, you need to clamp correctly (using \(\max(0, \cdot)\) and \(\min(q, \cdot)\)).Since the input may contain trailing whitespace or newlines,
strip()is used to remove leading and trailing whitespace.Source Code
N = int(input())
r = 0
w = 0
q = 0
for _ in range(N):
s = input().strip()
if s == 'R':
r += 1
elif s == 'W':
w += 1
else:
q += 1
diff = r - w
# We can assign each '?' to R (+1) or W (-1) to adjust diff
# We want to minimize |diff + (assigned_to_R - assigned_to_W)|
# Let x = number of '?' assigned to R, then assigned_to_W = q - x
# diff + x - (q - x) = diff + 2x - q
# Minimize |diff - q + 2x| for x in [0, q]
# Target: diff - q + 2x = 0 => x = (q - diff) / 2
target = q - diff
if target % 2 == 0 and 0 <= target // 2 <= q:
print(0)
else:
# Find closest x in [0, q] such that |diff - q + 2x| is minimized
# diff - q + 2x = 0 => x = (q - diff) / 2
x_ideal = (q - diff) / 2
x_low = max(0, int(x_ideal))
x_high = min(q, x_low + 1)
x_low = max(0, min(q, x_low))
best = min(abs(diff - q + 2 * x_low), abs(diff - q + 2 * x_high))
print(best)
This editorial was generated by claude4.6opus-thinking.
投稿日時:
最終更新: