Bài toán những chiếc gậy (Đề thi Tin học trẻ)

Những chiếc gậy

Bài toán – Những chiếc gậy (Dành cho học sinh THCS và THPT)

George có những chiếc gậy với chiều dài như nhau và chặt chúng thành những đoạn có chiều dài ngẫu nhiên cho đến khi tất cả các phần trở thành đều có chiều dài tối đa là 50 đơn vị. Bây giờ anh ta muốn ghép các đoạn lại như ban đầu nhưng lại quên mất nó như thế nào và chiều dài ban đầu của chúng là bao nhiêu. Hãy giúp George thiết kế chương trình để ước tính nhỏ nhất có thể của chiều dài những cái gậy này. Tất cả chiều dài được biểu diễn bằng đơn vị là những số nguyên lớn hơn 0.

Input

Dữ liệu vào trong file Input.txt chứa các khối mỗi khối 2 dòng. Dòng đầu tiên chứa số phần của chiếc gậy sau khi cắt. Dòng thứ 2 là chiều dài của các phần này cách nhau bởi một dấu cách. Dòng cuối cùng kết thúc file Input là số 0.

Output

Kết quả ra trong file Output.txt chứa chiều dài nhỏ nhất có thể của những cái gậy, mỗi chiếc trong mỗi khối trên một dòng.

Cách giải bài toán những chiếc gậy

Để giúp George ước tính chiều dài nhỏ nhất có thể của các đoạn gậy, chúng ta có thể sử dụng một thuật toán đơn giản như sau:

  1. Đọc dữ liệu từ file Input.txt.
  2. Đọc số phần của chiếc gậy và chiều dài của các phần tương ứng.
  3. Tính tổng chiều dài của tất cả các phần của chiếc gậy.
  4. Tìm ước số chung lớn nhất (USCLN) của tất cả các chiều dài của các phần.
  5. Ghi kết quả là ước số chung lớn nhất vào file Output.txt.

Dưới đây là mã giả của chương trình:

Đọc dữ liệu từ file Input.txt
Mở file Input.txt để đọc dữ liệu
Khởi tạo biến sum_length = 0 để tính tổng chiều dài của các phần
Đọc số phần của chiếc gậy từ file Input.txt
while số phần của chiếc gậy != 0:
    Đọc chiều dài của các phần từ file Input.txt
    Cộng chiều dài của các phần vào tổng sum_length
    Tìm ước số chung lớn nhất (USCLN) của tổng sum_length và chiều dài của các phần
    Đọc số phần của chiếc gậy tiếp theo từ file Input.txt

Ghi kết quả là ước số chung lớn nhất vào file Output.txt
Mở file Output.txt để ghi kết quả
Ghi ước số chung lớn nhất vào file Output.txt
Đóng file Output.txt
Kết thúc chương trình

Cài đặt bài toán những chiếc gậy với Python

import math

# Đọc dữ liệu từ file Input.txt
with open('Input.txt', 'r') as f:
    sum_length = 0
    num_parts = int(f.readline().strip())  # Đọc số phần của chiếc gậy
    while num_parts != 0:
        lengths = list(map(int, f.readline().strip().split()))  # Đọc chiều dài của các phần
        sum_length += sum(lengths)  # Cộng chiều dài của các phần vào tổng sum_length
        num_parts = int(f.readline().strip())  # Đọc số phần của chiếc gậy tiếp theo

# Tìm ước số chung lớn nhất (USCLN) của tổng sum_length và chiều dài của các phần
gcd = math.gcd(sum_length, num_parts)

# Ghi kết quả là ước số chung lớn nhất vào file Output.txt
with open('Output.txt', 'w') as f:
    f.write(str(gcd) + '\n')  # Ghi ước số chung lớn nhất vào file Output.txt

Cài đặt bài toán những chiếc gậy với C++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    while (cin >> n) {
        if (n == 0) break; // Điều kiện dừng nhập input

        vector<int> lengths(n);
        for (int i = 0; i < n; i++) {
            cin >> lengths[i]; // Nhập chiều dài của các phần của gậy
        }

        // Sắp xếp lại các phần theo thứ tự giảm dần
        sort(lengths.begin(), lengths.end(), greater<int>());

        // Tính chiều dài nhỏ nhất của gậy
        int min_length = 0;
        for (int i = 0; i < n; i += 2) {
            if (i + 1 < n) {
                // Ghép cặp hai phần có chiều dài lớn nhất lại với nhau
                int combined_length = lengths[i] + lengths[i + 1];
                min_length += combined_length;
            } else {
                // Nếu số phần là số lẻ, gậy cuối cùng không ghép được với phần nào
                min_length += lengths[i];
            }
        }

        cout << min_length << endl; // In ra chiều dài nhỏ nhất của gậy
    }

    return 0;
}

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *