Cách khắc phục Segmentation Fault trong "Bi và tàu hoả" trên SPOJ PTIT

tiện thể tìm hộ e lỗi sai bài này được k ạ?
đề bài: (DEAD LINK) https://www.spoj.com/ITPTIT/problems/ITP0183B/
code c e:http://codepad.org/kniVt6ct
e cảm ơn trước…

Về lỗi Segmentation Fault

Bạn nên tránh sử dụng lệnh có biến n chưa xác định khi khai báo mảng.

int a[n][4];

Thay vào đó nên sử dụng mảng động, tự cấp phát tự thu hồi.

int **a = NULL;

a = new int*[n];
for (int i = 0; i < n; i++) {
  a[i] = new int[4];
}

for (int i = 0; i < n; i++) {
  delete[] a[i];
}
delete[] a;
a = NULL;

Về bài tập:

Xét trục toạ độ Ox tâm O tại điểm 1, vector i có độ dài 1 và hướng từ điểm 1 tới điểm L (đặt cho nó có chút toán học tí :penguin:)

Số đèn lồng từ điểm 1 tới điểm n, tạm gọi là d(n)

  • d(n) = [n/v] + 1, khi v ∣ n (n chia hết cho v)
  • d(n) = [n/v], khi v ⫮ n (n không chia hết cho v)
  • ([a] là phần nguyên của a)

Số đèn lồng từ điểm m tới điểm n, kí hiệu d(n, m), m <= n

  • d(n, m) = d(n) - d(m), khi v ⫮ m
  • d(n, m) = d(n) - d(m) + 1, khi v ∣ m

Số đèn lồng từ điểm 1 tới điểm L, bị chắn bởi đoạn [m, n], với m <= n:

  • d(L) - d(n, m)

Không biết lúc triển khai ra công thức tổng quát có giống bạn không, vì cần tới 8 trường hợp để xem xét (2 * 2 * 2, 2 lần cho v ∣ m, 2 lần cho v ∣ n, 2 lần cho v ∣ L)


Note: không nên đặt biến l (L viết thường), vì dễ nhầm giữa giữa kí tự l, kí tự | (vertical bar) và số 1.

2 Likes

Mảng nhỏ thì vẫn dùng VLA được (trong C) :smiley:

2 Likes

cảm ơn bác nhé :v chứ e làm thiếu trường hợp -_- đầu óc chán quá

không hiểu sao, mình không thể tiếp xúc được syntax của C++, nhìn là ngán rồi, mình chỉ thích C thôi, toàn malloc, calloc, free…

“Chưa thấy (Ruby on) Rails (magic) / JSP (config) chưa đổ lệ” :smiley:

STL chịu khó cũng học được, nó ít có magic. Chỉ xin đừng ham hố cái template (very deep) quá, nó là Turing-complete đấy :smiley:

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