Dãy Con Lớn Nhất Có Độ Dài Như Nhau

Dãy Con
Cho dãy số nguyên A gồm n phần tử A[1],A[2],..,A[n] và một số nguyên dương d (1<= d <= n)
Hãy tìm một đoạn con liên tiếp của dãy A có độ dài d và có tổng các phần tử đạt giá trị lớn nhất (độ dài của đoạn con là số lượng phần tử trên đoạn con đó).
Yêu cầu :tính tổng các phần tử trên đoạn con theo yêu cầu như trên
Dữ liệu vào : từ tệp DAYCON.INP có cấu trúc như sau
- dòng thứ nhất chứa hai số nguyên dương n,d (1 <= d <= n <= 10^6)
- dòng thứ hai chứa n số nguyên A[1],A[2],..,A[n] trong đó (A <= 10^4,1 <= i <=n)
Dữ liệu ra: Ghi vào tệp DAYCON.OUT gồm một số nguyên duy nhất là tổng các phần tử trên đoạn con tìm được có giá trị lớn nhất


DAYCON.INP DAYCON.OUT
5 3
-4 3 -2 6 5
9



- Bài này mình vừa thi xong,mọi người giúp mình với
- Mình không làm được bài này lúc thi,tiếc lắm,mong mọi người giúp ạ
 

tengiday

Happy life
Bạn chỉ cần đọc d phần tử liên tiếp từ đầu tới cuối dãy. Khi đọc tới a thì sum = sum + a - a[i - d - 1] (lấy 1 phần tử mới và loại 1 phần tử cũ). Thuật toán có độ phức tạp O(n).
 
Nhưng nếu với i=1 thì a[i-d-1] chẳng phải sẽ thành vị trí âm sao? Mình vẫn chưa hiểu lắm....
 

tengiday

Happy life
Nhưng nếu với i=1 thì a[i-d-1] chẳng phải sẽ thành vị trí âm sao? Mình vẫn chưa hiểu lắm....
- Đầu tiên bạn tính tổng của d phần tử đầu tiên: a[1] + ... + a[d].
- Sau đó cho 'for i := d + 1 to n' rồi tính 'sum = sum + a - a[i - d - 1]'. Mỗi lần có tổng mới thì bạn so sánh với tổng max.
 
- Đầu tiên bạn tính tổng của d phần tử đầu tiên: a[1] + ... + a[d].
- Sau đó cho 'for i := d + 1 to n' rồi tính 'sum = sum + a - a[i - d - 1]'. Mỗi lần có tổng mới thì bạn so sánh với tổng max.


- Mình làm được bài rồi,dễ hơn mình tưởng...
- Cảm ơn bạn nhé
 
Top