Bài tập  /  Bài đang cần trả lời

Giải bài có thưởng!

Tìm dãy con liên tiếp A[L],A[L+1],…,A[R]A[L],A[L+1],…,A[R] (với 1≤L≤R≤N1≤L≤R≤N) trong dãy đã cho có giá trị trung bình lớn nhất


Dãy con có giá trị trung bình lớn nhất

Cho một dãy gồm NN số nguyên A[1],A[2],…,A[N]A[1],A[2],…,A[N]. Tìm dãy con liên tiếp A[L],A[L+1],…,A[R]A[L],A[L+1],…,A[R] (với 1≤L≤R≤N1≤L≤R≤N) trong dãy đã cho có giá trị trung bình lớn nhất.

Giá trị trung bình của dãy con được tính bằng công thức:

Trung bıˋnh=A[L]+A[L+1]+…+A[R]R−L+1Trung bıˋnh=R−L+1A[L]+A[L+1]+…+A[R]​
Đầu vào:
  • Dòng đầu chứa số nguyên NN.
  • Dòng tiếp theo chứa NN số nguyên A[1],A[2],…,A[N]A[1],A[2],…,A[N].
Ràng buộc:
  • 1≤N≤1041≤N≤104
  • −109≤A[i]≤109−109≤A[i]≤109 với i=1,2,…,Ni=1,2,…,N.
0 Xem trả lời
Hỏi chi tiết
31
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Để tìm dãy con liên tiếp có giá trị trung bình lớn nhất trong một dãy số nguyên, chúng ta có thể sử dụng một số phương pháp tối ưu hơn là brute-force, đặc biệt khi dãy số có kích thước lên đến 10^4.

### Ý tưởng tổng quát:

1. **Trung bình và tổng**: Giá trị trung bình của một dãy con có thể được tính bằng tổng của các phần tử trong dãy đó chia cho số lượng phần tử. Do đó, để tìm dãy con mà có giá trị trung bình lớn nhất, ta cần tối đa hóa tổng các phần tử.

2. **Tính toán dãy con**: Ta sẽ duyệt qua tất cả các dãy con liên tiếp bằng cách sử dụng hai vòng lặp để lặp qua các chỉ số bắt đầu và kết thúc của dãy con.

3. **Theo dõi giá trị trung bình**: Ta cần lưu giữ tổng và số lượng phần tử, sau đó tính toán giá trị trung bình. Nếu gặp giá trị trung bình cao hơn giá trị trung bình lớn nhất đã tìm thấy, ta sẽ cập nhật.

### Triển khai thuật toán:

Giả sử dãy số là A[1], A[2], ..., A[N]:

```python
def max_average_subarray(A):
N = len(A)

max_avg = float('-inf')
best_L = 0
best_R = 0

# Duyệt qua tất cả các dãy con liên tiếp
for L in range(N):
total = 0
for R in range(L, N):
total += A[R]
# Tính giá trị trung bình
current_avg = total / (R - L + 1)
if current_avg > max_avg:
max_avg = current_avg
best_L, best_R = L, R

# Chuyển đổi từ chỉ số 0 đến 1 (nếu cần)
return best_L + 1, best_R + 1, max_avg # Trả về L, R và giá trị trung bình lớn nhất

# Đọc dữ liệu từ input
N = int(input())
A = list(map(int, input().split()))

# Gọi hàm và in kết quả
L, R, avg = max_average_subarray(A)
print(f"Dãy con có chỉ số từ {L} đến {R} có giá trị trung bình lớn nhất là: {avg:.6f}")
```

### Giải thích mã:

1. **Hàm `max_average_subarray`**: Nhận đầu vào là dãy số A. Ta khởi tạo biến để theo dõi giá trị trung bình lớn nhất và các chỉ số L, R tương ứng.

2. **Hai vòng lặp for**: Vòng ngoài duyệt qua điểm bắt đầu L, vòng trong duyệt từ L đến điểm kết thúc R, tính tổng và giá trị trung bình cho dãy con A[L]...A[R].

3. **So sánh và cập nhật**: Nếu giá trị trung bình hiện tại lớn hơn giá trị trung bình lớn nhất đã lưu, ta cập nhật các chỉ số và giá trị trung bình lớn nhất.

4. **Kết quả**: Cuối cùng, hàm trả về các chỉ số của dãy con có giá trị trung bình lớn nhất và giá trị trung bình đó.

### Tối ưu hóa:

Phương pháp này có độ phức tạp time complexity là O(N^2), không tối ưu cho N lớn. Tuy nhiên, với 1 ≤ N ≤ 10^4, phương pháp này cần được cải thiện nếu muốn kết quả nhanh hơn.

Một cách tiếp cận khác để cải thiện thời gian là sử dụng thuật toán Sliding Window hoặc Kadane's algorithm, nhưng trong trường hợp này, cách tìm kiếm từng dãy con là cần thiết theo yêu cầu vấn đề đề ra.

Bạn hỏi - Lazi trả lời

Bạn muốn biết điều gì?

GỬI CÂU HỎI
Học tập không giới hạn cùng học sinh cả nước và AI, sôi động, tích cực, trải nghiệm

Hôm nay bạn thế nào? Hãy nhấp vào một lựa chọn, nếu may mắn bạn sẽ được tặng 50.000 xu từ Lazi

Vui Buồn Bình thường
×
Trợ lý ảo Trợ lý ảo
×
Đấu trường tri thức | Lazi Quiz Challenge +500k
Gửi câu hỏi
×