Làm sao để có câu trả lời hay nhất?
29/03/2025
29/03/2025
Đề bài này yêu cầu tìm tổng số nấm lớn nhất mà Bờm có thể thu hoạch được trong phạm vi k từ một điểm xuất phát tối ưu. Dưới đây là cách giải bài toán này:
1. Ý tưởng:
Sắp xếp các vị trí nấm theo thứ tự tăng dần.
Duyệt qua từng vị trí nấm làm điểm xuất phát.
Với mỗi điểm xuất phát, tính tổng số nấm thu hoạch được trong phạm vi k.
Tìm tổng số nấm lớn nhất.
2. Thuật toán:
Đọc số nguyên n và k từ đầu vào.
Đọc thông tin về các vị trí nấm (ci và xi) và lưu vào một danh sách.
Sắp xếp danh sách các vị trí nấm theo thứ tự tăng dần của xi.
Khởi tạo biến max_mushroom để lưu tổng số nấm lớn nhất, ban đầu đặt max_mushroom = 0.
Duyệt qua từng vị trí nấm trong danh sách:
Khởi tạo biến current_mushroom để lưu tổng số nấm thu hoạch được từ vị trí này, ban đầu đặt current_mushroom = 0.
Duyệt qua tất cả các vị trí nấm khác:
Nếu khoảng cách giữa vị trí nấm hiện tại và vị trí nấm đang xét nhỏ hơn hoặc bằng k, cộng số nấm tại vị trí đang xét vào current_mushroom.
Cập nhật max_mushroom = max(max_mushroom, current_mushroom).
In ra max_mushroom.
3. Mã giả:
Đọc n, k
Đọc danh sách các vị trí nấm (ci, xi)
Sắp xếp danh sách theo xi
max_mushroom = 0
for mỗi vị trí nấm (ci, xi) trong danh sách:
current_mushroom = 0
for mỗi vị trí nấm (cj, xj) trong danh sách:
if abs(xi - xj) <= k:
current_mushroom = current_mushroom + cj
max_mushroom = max(max_mushroom, current_mushroom)
In ra max_mushroom
4. Cài đặt Python:
Python
def max_mushroom_harvest(n, k, mushrooms):
mushrooms.sort(key=lambda x: x[1]) # Sắp xếp theo vị trí xi
max_mushroom = 0
for i in range(n):
current_mushroom = 0
for j in range(n):
if abs(mushrooms[i][1] - mushrooms[j][1]) <= k:
current_mushroom += mushrooms[j][0]
max_mushroom = max(max_mushroom, current_mushroom)
return max_mushroom
n, k = map(int, input().split())
mushrooms = []
for _ in range(n):
c, x = map(int, input().split())
mushrooms.append((c, x))
print(max_mushroom_harvest(n, k, mushrooms))
5. Độ phức tạp:
Độ phức tạp thời gian: O(n^2)
Độ phức tạp không gian: O(n)
6. Tối ưu hóa:
Để tối ưu hóa, ta có thể sử dụng phương pháp "sliding window" (cửa sổ trượt) hoặc các cấu trúc dữ liệu như cây nhị phân tìm kiếm.
7. Mã Python tối ưu hóa(sử dụng sliding window):
Python
def max_mushroom_harvest_optimized(n, k, mushrooms):
mushrooms.sort(key=lambda x: x[1])
max_mushroom = 0
for i in range(n):
current_mushroom = 0
left = i
right = i
while left >= 0 and abs(mushrooms[i][1] - mushrooms[left][1]) <= k:
current_mushroom += mushrooms[left][0]
left -= 1
while right < n and abs(mushrooms[i][1] - mushrooms[right][1]) <= k:
if right != i:
current_mushroom += mushrooms[right][0]
right += 1
max_mushroom = max(max_mushroom, current_mushroom)
return max_mushroom
n, k = map(int, input().split())
mushrooms = []
for _ in range(n):
c, x = map(int, input().split())
mushrooms.append((c, x))
print(max_mushroom_harvest_optimized(n, k, mushrooms))
hahahihi
29/03/2025
Thảng Hân tại sao phần python kq in ra 10
sai rồi
Nếu bạn muốn hỏi bài tập
Các câu hỏi của bạn luôn được giải đáp dưới 10 phút
CÂU HỎI LIÊN QUAN
Top thành viên trả lời