結果
| 問題 |
No.178 美しいWhitespace (1)
|
| コンテスト | |
| ユーザー |
qwewe
|
| 提出日時 | 2025-05-14 13:14:45 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 12 ms / 2,000 ms |
| コード長 | 5,770 bytes |
| コンパイル時間 | 732 ms |
| コンパイル使用メモリ | 75,536 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-05-14 13:15:46 |
| 合計ジャッジ時間 | 1,713 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 |
ソースコード
#include <iostream> // For input (std::cin) and output (std::cout)
#include <vector> // For std::vector to store initial widths
#include <algorithm> // For std::max to find the maximum width
int main() {
// Optimize standard C++ streams for faster Input/Output operations.
// This is often helpful in competitive programming to avoid Time Limit Exceeded.
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int n; // Variable to store the number of lines in the source code
std::cin >> n; // Read the number of lines from standard input
// Vector to store the initial width of each line.
// Using 'long long' is important because the width (a + 4*b) can potentially
// exceed the maximum value of a 32-bit integer, given that a_i and b_i can be up to 10^7.
// Max width could be around 10^7 + 4 * 10^7 = 5 * 10^7, which fits in a 32-bit int,
// but the sum of differences might exceed it. Using long long throughout for safety.
std::vector<long long> initial_widths(n);
// Variable to keep track of the maximum initial width encountered among all lines.
// Initialized to 0. Using 'long long' for consistency.
long long max_initial_width = 0LL;
// Variable to store the parity (0 for even, 1 for odd) required for all lines.
// We determine this from the first line and check consistency with subsequent lines.
// Initialized to -1 to indicate that the required parity hasn't been determined yet.
int required_parity = -1;
// Boolean flag to track if it's possible to make all lines have the same width.
// We initially assume it is possible and set it to false if we find a contradiction.
bool possible = true;
// First pass: Read input, calculate initial widths, find the maximum width,
// and check if all initial widths have the same parity.
for (int i = 0; i < n; ++i) {
int a; // Number of spaces on the current line
int b; // Number of tabs on the current line
std::cin >> a >> b; // Read the counts of spaces and tabs for line i
// Calculate the initial width of the current line using the formula: a + 4*b.
// Use '4LL' (long long literal) to ensure the multiplication is done using 64 bits,
// preventing potential overflow before adding 'a'.
long long current_width = (long long)a + 4LL * b;
// Store the calculated initial width in the vector at the corresponding index.
initial_widths[i] = current_width;
// Update the maximum initial width if the current line's width is greater
// than the maximum found so far.
max_initial_width = std::max(max_initial_width, current_width);
// Check the parity of the current width, but only if we haven't already
// determined that it's impossible.
if (possible) {
int current_parity = current_width % 2; // Calculate parity (0 for even, 1 for odd)
// If the required parity hasn't been set yet (this is the first line processed,
// effectively), set the required parity based on this line.
if (required_parity == -1) {
required_parity = current_parity;
}
// If the required parity has already been set, compare the current line's parity to it.
// If they differ, it's impossible to make all lines have the same width by adding
// full-width spaces (since each adds 2, preserving parity).
else if (current_parity != required_parity) {
possible = false; // Mark as impossible. No need to check parity further.
}
}
}
// After processing all lines, check the 'possible' flag.
if (!possible) {
// If it was determined to be impossible (due to inconsistent parities),
// print -1 followed by a newline, as required by the problem statement.
std::cout << -1 << std::endl;
} else {
// If it is possible (all initial widths have the same parity), calculate
// the total minimum number of full-width spaces needed.
long long total_full_width_spaces = 0LL; // Initialize the total count to 0.
// The target width for all lines must be at least the maximum initial width.
// To minimize the number of added full-width spaces, we choose the smallest
// possible target width, which is exactly the 'max_initial_width'.
// This target width is achievable for all lines because:
// 1. target_width >= initial_width[i] for all i.
// 2. target_width and initial_width[i] have the same parity for all i,
// so (target_width - initial_width[i]) is always an even non-negative number.
long long target_width = max_initial_width;
// Second pass: Iterate through the stored initial widths of all lines.
for (long long width : initial_widths) {
// Calculate the difference between the target width and the current line's initial width.
// This difference represents the total width that needs to be added to this line.
long long diff = target_width - width;
// Since each full-width space contributes 2 to the width, the number of
// full-width spaces needed for this specific line (c_i) is half the difference.
// Integer division (diff / 2) gives the correct number of spaces.
total_full_width_spaces += diff / 2;
}
// Print the calculated total minimum number of full-width spaces required
// across all lines, followed by a newline.
std::cout << total_full_width_spaces << std::endl;
}
// Indicate successful program execution by returning 0.
return 0;
}
qwewe