Tìm dãy con có tổng bằng S (n <=2.10^6, s<=10^9)

Chào mọi người ạ! Mọi người có thể cho mình xin ý tưởng bài này không ạ?

Dùng kĩ two pointer thôi bạn

Trong bài này thay vì tìm 1 cặp a[i], a[j] thì tính cộng dồn từ i đến j. Do a[i] > 0 nên tổng này là dãy tăng khi tăng j và giảm khi tăng i.

9 Likes

Bạn đã thử làm cách tệ nhất chưa? Là cách đề ghi sao làm y như vậy, O(n^3)

2 Likes

Rồi chừng nào xong :smiley:

Bài này dùng prefix sum :slight_smile:

3 Likes

Khi người ta chưa nghĩ ra được gì thì bạn nói “prefix sum” có giúp ích được gì? Bạn đang muốn tỏ ra bạn biết giải? có quan trọng không?
học lập trình phải đi từ phương pháp đơn giản rồi mới tới những thứ như giải thuật,
ngay cả implement cái đề bài còn chưa được thì nói gì tới giải thuật ở đây?

3 Likes

Em nghĩ ý anh @rogp10 muốn bạn ý googling thôi, không có ý gì đâu anh :slight_smile:

3 Likes

Cách kém tối ưu O(n^2)

#include <iostream>
using namespace std;
int tinhKetQua(int a[], int n, int K){
    int kq = 0;
      for(int i = 0;i < n; i++){
        int sum = 0;
        for(int j = i;j<n;j++){
            sum += a[j];
            if(sum == K){
                kq++;
            }
        }
    }
    return kq;
}
int main()
{
    int kq = 0;
    int n,K;
    cin>>n>>K;
    int a[n];
    for(int i = 0;i<n;i++){
        cin>>a[i];
    }
    kq = tinhKetQua(a,n,K);
    cout<<kq;
    return 0;
}
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?