Bài tập đếm tất cả các cặp phần tử có hiệu bằng k

Cho mảng a[] gồm n phần tử và số k.Đếm tất cả các cặp phần tử có hiệu bằng k.
Ý tưởng của em là sắp xếp lại mảng rồi sử dụng tìm kiếm nhị phân để tìm a[i] + k có trong mảng không.
dưới là code của em ạ.Không hiểu sai ở đâu mà cứ không ra được.Anh chị giúp em với ạ

#include<algorithm>
using namespace std;
int searching(int a[] , int low , int high, int x ) {
	if (high>=low) {
		int mid=(high+low)/2;
		if (x==a[mid]) return mid;
		if (x > a[mid]) return searching(a, (mid+1) , high, x );
		else return searching(a, low , (mid-1), x );
	
	}
	return -1;
}
int main() {
	int t;
	while(t--) {
		int n,*a,k;
		cin>>n>>k;
		a=new int [n+1];
		for(int i=0;i<n;i++) {
			cin>>a[i];
		}
		sort(a,a+n);
		int count=0;
		for(int i=0;i<n;i++) {
			if (searching(a,i+1,n-1,a[i]+k)!=-1) count++;
		}
		cout<<count;
	}
}
  1. Biến t bạn mới chỉ khai báo, chưa gán giá trị mà đã đi dùng nó cho điều kiện while, với lại mình không hiểu bạn dùng biến t để làm gì ?

  2. Mình khuyên bạn đừng nên để điều kiện kiểu while (t--) mà nên tách riêng t-- ra. Vì ở đây t là kiểu int nên mọi chuyện có lẽ suôn sẻ, nhưng khi t không còn là kiểu int nữa mà là một kiểu dữ liệu phức hợp thì mọi chuyện không còn đơn giản như vậy đâu (mình từng bị lỗi do cái này rồi).

  3. Mảng có n phần tử thì bạn cấp phát n + 1 phần tử để làm gì ?

2 Likes

Rối rắm nhỉ!
Để nguyên mảng như thế rồi dùng 2 vòng lặp lồng nhau mà tìm là ra thôi.

2 Likes

Sort xong dùng window scan là đúng nhất.

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