Mn giúp em ý bài này với ạ, nếu số lớn nhất đã được đếm rồi thầy không đếm nữa phải không ạ
Gợi ý bài tập đếm số lượng phần tử lớn nhất trong dãy con liên tiếp k phần tử
Ví dụ trên mình hiểu là có 2 số lớn nhất trong dãy con k phần tử là 4 và 6 vì 4 có trong dãy con (1-4) (2-1) còn 6 có trong dãy con (3-6).
Phân tích bài này một xíu:
- Cho dãy
Nphần từ, đánh số từ1đếnNcần tìm tất cả dãy con liên tiếp cóKphần từ. Rồi tìm số lớn nhất của các dãy con này. - Vì dãy con là liên tiếp, nên dãy con đầu tiên sẽ gồm các phần tử từ
1đếnK, dãy tiếp theo là từ2đếnK+1… dãy con cuối cùng là từN-K+1đếnN=> có tất cảN-K+1dãy con. Sẽ có 2 trường hợp:- Nếu số lớn nhất đã đếm rồi được đếm lại => mỗi dãy con sẽ luôn có 1 số lớn nhất => đáp án bài toán là
N-K+1 - Nếu số lớn nhất đã đếm rồi không phải đếm nữa => tìm và đánh dấu phần từ lớn nhất rồi duyệt lại toàn dãy để đếm
- Nếu số lớn nhất đã đếm rồi được đếm lại => mỗi dãy con sẽ luôn có 1 số lớn nhất => đáp án bài toán là
- Vậy, theo bạn @Quoc_Bao_Nguyen1 thì trường hợp nào sẽ hợp lý hơn?
Trường hợp 2 ạ, với mình dùng cách này ổn k b
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, k; cin >> n >> k;
int a[n];
int cnt = 0, max1 = -1e9;
set s;
for(int i=0; i<n; i++) cin >> a[i];
for(int i=0; i<=n-k; i++){
max1 = -1e18;
for(int j=0;j<k;j++){
max1 = max(max1,a[i+j]);
}
s.insert(max1);
}
cout << s.size();
return 0;
}
Không rõ là ổn không nhưng bạn thử test với input này xem:
6 2
1 2 1 2 1 2
Bài này mình sẽ dùng max-heap.
1 Like
Hmm… Hình như là bạn học hơi thụ động thì phải.
Bạn thấy output này đúng hay sai?
Tại sao đáp án trong code lại là 1?
Bạn tự giải tay thì ra đáp án là bao nhiêu?
vân vân và mây mây…


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?