Tìm chênh lệch nhỏ nhất giữa hai phần tử

Mọi người cho em hỏi bài này của em bị lỗi gì ạ, em không hiểu sai chỗ nào ý. Đề là nhập vào một mảng số nguyên, in ra khoảng cách nhỏ nhất giữa các phần tử, ( ví dụ 3 -7 0 thì in ra 3 ạ ). Với bộ kiểm thử 100000 số thì chương trình báo lỗi ạError
Task failed with signal 11
** Further testing aborted **

#include<iostream>
#include<cmath>

using namespace std;

int main() {
	long x, n, a[10000], b[10000], i, j, k = 0, min;
	cin >> n;
	for(i=0;i<n;i++)
		cin >> a[i];
	x = n * (n - 1) / 2;
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
		{
			b[k] = a[i] - a[j];
			k++;
		}
	for(i=0;i<x;i++)
		b[i] = abs(b[i]);
	min = b[0];
	for(i=1;i<x;i++)
	{	
		if(b[i] < min)
			min = b[i];
		}	
	cout << min;
}

100k số thì k phải bằng bao nhiêu :slight_smile:

Và bạn sẽ nhận ra là cách này không hay :slight_smile: Bạn cần phải xếp lại thì mới thấy min.

4 Likes
  • Không nên khai báo mảng tĩnh trên 1000 phần tử. Tuỳ theo hệ điều hành, stack mặc định có kích thước khác nhau. Có khi chỉ khai báo long a[1024]; là stack đã không đủ cấp phát cho chương trình rồi.
  • Đã là C++ thì bạn nên dùng vector, đừng dùng mảng trừ khi đề bắt buộc.
  • Thuật toán đơn giản nhất với bài của bạn:
  1. Sắp xếp mảng đầu vào
  2. Tìm khoảng cách nhỏ nhất giữa 2 phần tử liên tiếp và in ra.
5 Likes

mình cũng bị lỗi
Error
Task failed with signal 11
** Further testing aborted **

int *arr;
arr = new int[n];

hay

vector<int> arr(100, 0);

đều bị lỗi @@;
không biết sao để tránh khỏi lỗi này nhỉ @@

Khai báo mảng ít quá, khi n to (100k) thì truy cập vào a[n-1] làm sao đây? Mảng khai báo có 100 phần tử làm sao đủ?

1 Like
#include<iostream>
#include<cmath>
#include<vector>

using namespace std;

int main()
{
	int n;
	cin >> n;
	vector<int> a;
	vector<int> nho;
	for(int i=0; i<n; i++)
	{
			int c;
			cin >> c;
			a.push_back(c);
	}
		
	for(int i=0; i<a.size()-1; i++)
		{
			int gtnn=abs(a.at(i)-a.at(i+1));
			for(int j=i+1; j<a.size(); j++)
				{
					if(abs(a.at(j)-a.at(i)) < gtnn)
					{
						gtnn=abs(a.at(j)-a.at(i));
					}
				}
			nho.push_back(gtnn);
		}	
	
	int min=nho.at(0);
	for(int i=0; i<a.size()-1; i++)
		{
			if(nho.at(i) < min)
				{
					min=nho.at(i);
				}
		}
	cout << min;
}

em code như này thì bị báo lỗi:
Time limit exceeded
bác sửa giúp em với ạ. Em cảm ơn.

Cách khả thi nhất là sort mảng.

4 Likes

cảm ơn bác nhé, em làm được rồi :smiley:

Lỡ mà có nhiều hơn 1 cặp thì sao bác

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