01/10/2018, 14:39

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;
}
rogp10 viết 16:44 ngày 01/10/2018

b[k] = a[i] - a[j];
k++;

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

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

Trần Hoàn viết 16:49 ngày 01/10/2018
  • 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.
Văn Long viết 16:46 ngày 01/10/2018

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

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

hay

vector arr(100, 0);

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

HK boy viết 16:47 ngày 01/10/2018

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 đủ?

Bài liên quan
0