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

Xem dạng PDF

Gửi bài giải


Điểm: 10,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: average.inp
Output: average.out

Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, JavaScript, Kotlin, Pascal, Perl, PHP, PyPy, Python, Ruby, Rust, Scratch, Swift

Trong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài


Bình luận

Please read the guidelines before commenting.



  • 0
    caodanganhkhoa2015  đã bình luận lúc 12, Tháng 6, 2026, 14:31
    • #include <iostream>

      include <vector>

    include <algorithm>

    using namespace std;

    int main() { // Tối ưu tốc độ đọc ghi dữ liệu cho C++ iosbase::syncwith_stdio(false); cin.tie(NULL);

    // Chuyển hướng đọc ghi file (Bỏ comment nếu hệ thống yêu cầu nộp bằng file)
    // freopen("Average.inp", "r", stdin);
    // freopen("Average.out", "w", stdout);
    
    int n;
    if (!(cin >> n)) return 0;
    
    vector&lt;long long> a(n);
    long long max_val = -1;
    
    // Bước 1: Đọc mảng và tìm giá trị lớn nhất (max_val)
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        if (a[i] > max_val) {
            max_val = a[i];
        }
    }
    
    // Bước 2: Tìm độ dài đoạn con liên tiếp dài nhất chỉ chứa max_val
    int max_len = 0;
    int current_len = 0;
    
    for (int i = 0; i < n; i++) {
        if (a[i] == max_val) {
            current_len++;
            if (current_len > max_len) {
                max_len = current_len;
            }
        } else {
            current_len = 0; // Ngắt quãng, reset lại biến đếm
        }
    }
    
    // In kết quả ra màn hình/file
    cout << max_len << "\n";
    
    return 0;
    

    }


  • 0
    ashita2504  đã bình luận lúc 22, Tháng 7, 2025, 11:22

    Lưu ý các bạn hãy cố gắng giải quyết bài này trước khi đọc sol nhé! Bài này thực tế không quá khó nên các masters bỏ qua cho mình ạ! Còn bạn nào đang gặp khó khăn thì đây là lời giải:

    Đầu tiên các bạn hãy phân tích thử một dãy số bất kì nhé! VD: 1 2 2 3 4 5 6 Dễ thấy, một dãy con trong dãy số này không nhất thì phải là 2 phần tử hay 3 phần tử trở lên, mà hoàn toàn có thể chỉ là 1 phần tử duy nhất, đúng vậy, chỉ 1 phần tử duy nhất cũng có thể là một dãy con, và khi đó thì chúng ta hoàn toàn có thể nghĩ tới việc lấy phần tử lớn nhất trong dãy để chia cho độ dài của chính nó, tức là 1 phần tử. Đối với dãy trên thì max là 6, chia cho chính nó thì chúng ta sẽ có ngay kết quả là 6. Và bạn nhìn thử xem! Không còn bất kì dãy nào có trung bình cộng lớn hơn 6 được nữa cả! Vậy ra mấu chốt nằm ở đây. Giả sử ta có một dãy số khác, 1 2 2 3 6 6 6 4 5, à cũng khá là giống dãy trên đúng không, nhưng chỉ khác ở đây là chúng ta có nhiều "số 6" xuất hiện trong mảng hơn. Khi này, bạn có nhận ra rằng, nếu chúng ta có thể cộng tất cả 3 số 6 đó lại, và chia cho 3, thì chúng ta sẽ được dãy con dài nhất có trung bình cộng lớn nhất không ạ? Vậy thì chúng ta đã biết được dãy con dài nhất có trung bình cộng lớn nhất ở đâu, chính là dãy các phần tử lớn nhất liên tiếp nhau dài nhất trong mảng. Lúc này bài toán sẽ là: "Tìm dãy con chỉ bao gồm các phần tử lớn nhất liên tiếp dài nhất". VD: Cho mảng A là [2 8 8 8 3 8 8 8 8 0]. Bởi vì số 8 là lớn nhất trong dãy này, và bắt đầu từ A[2] tới A[4] và A[6] tới A[9] (giả sử mảng bắt đầu từ 1), ta thấy một chuỗi liên tiếp lần lượt gồm 3 số 8 và 4 số 8 liên tiếp nhau đúng không ạ? Vì ta cần tìm dãy dài nhất, nên ta kết luận dãy từ A[6] tới A[9] là dài nhất, kết quả sẽ là bằng 4. Đến đây thì rất dễ hiểu rồi, vậy thì có cách nào để tìm ra dãy liên tiếp gồm các phần tử lớn nhất liên tiếp nhau không? Các bạn có thể suy nghĩ tiếp, nếu cảm thấy khó khăn thì đây là ý tưởng của mình:

    Khi nhắc tới việc tìm dãy liên tiếp các phần tử giống nhau dài nhất, ta có thể nghĩ tới việc sử dụng một vòng lặp while lồng bên ngoài một vòng lặp for đúng không? Đó là cách đơn giản nhất để xử lý tình huống này, nhưng mình có một cách khác các bạn có thể tham khảo một chút nhé! Ở đây mình gọi f[i] sẽ là mảng đánh dấu các khoảng liên tiếp nhau của phẩn tử lớn nhất liên tiếp nhau trong mảng. Mình sẽ duyệt qua một vòng for để duyệt từng phần tử một, để tìm tới phần tử lớn nhất mà mình đã biết trước. Từ đây, nếu gặp phần tử lớn nhất thì mình sẽ cho f[i] = f[i - 1] + 1. Còn nếu như phần tử mình gặp không phải là phần tử lớn nhất, mình sẽ đặt f[i] = 0. Ví dụ với mảng A = 2 8 8 8 3 8 8 8 8 0 trên, thì mảng f của mình sẽ là 0 1 2 3 0 1 2 3 4 0 Ở vị trí có các số tăng liên tiếp nhau như 1 2 3 và 1 2 3 4, đó là dãy các phần tử số 8, và nó đã tính được 2 khoảng có độ dài là 3 và 4. Lý do là vì mình đã để f[i] = f[i - 1] + 1 khi mà có phần tử lớn nhất giống nhau liên tiếp, còn khi không gặp phần tử lớn nhất đó thì nó sẽ để f[i] = 0, giúp cho các phần tử lớn nhất nếu có xuất hiện phía sau sẽ có thể bắt đầu đếm lại từ 1.

    Hi vọng comment này sẽ giúp bạn có thể AC được bài này ^^ Cảm ơn các bạn đã dành thời gian để đọc!


  • 0
    Uoao1807  đã bình luận lúc 14, Tháng 12, 2024, 17:54

    bi timeout hoai vay :/


    • 0
      KS_TDN_LDMQ  đã bình luận lúc 5, Tháng 3, 2025, 10:50

      using string