PDA

View Full Version : [Q] có bài toán về kỹ thuật cầm canh hơi khó, các bạn giúp tôi với !



nguyenducduy
20-10-2002, 08:13
Các bạn ơi !
tôi mới chỉ học lập trình Pascal có vài tháng , có bài toán về lập trình pascal nói về kỹ thuật tìm kiếm cầm canh (cần phải đặt một lính canh ở cuối Mảng ấy mà) . đề bài toán như sau : "nhập vào một dãy các số nguyên rồi in ra các số khác nhau trong dãy" . các bạn có thể chỉ tôi giải thuật hoặc là source code không vậy ?:)
Cám ơn các bạn !

Zero
20-10-2002, 16:24
Giới hạn các số nguyên đó là bào nhiêu?
nếu là 1..20000 thì có cách này

var
a : array[1..10000] of integer;

begin
fillchar(a,sizeof(a),0);

write('Số số ');
readln(n);

for i:=1 to n do
begin
write('Nhập số thứ ',i,' ');
readln(t);
inc(a[t]);
end;

các số khác nhau trong dãy là các số bi thoả mãn a[bi] > 0 ok?

end.

real_time
20-10-2002, 16:33
thuật toán lính cầm canh là: chẳng hạn nhé: bạn sẽ đem phần tử nào đó ra so sánh với các phần tử khác nếu thoả mãn điều kiện của bạn thì sẽ được in ra còn không thì sẽ loại bỏ!(không nhất thiết phải đặt ở cuối mà ở đầu cũng được)

Mad Dragon
20-10-2002, 22:49
Cho biến i chạy từ 1 đến phần tử cuối,trong mỗi vòng,xét xem phần tử thứ i đó có giống với các phần tử còn lại không? Nếu có nhảy khỏi vòng lặp,nếu không chạy tiếp...

Zero
21-10-2002, 11:27
Cách của bạn là cách chuẩn nhưng chạy sẽ rất lâu đó độ phức tạp của nó là O(n^2) nếu dùng chiêu của mình độ phức tạp có O(n) thôi.

real_time
25-10-2002, 14:28
theo mình được biết l_ có thể dùng thêm thu_t toán chia để trị xong phối hợp với l_nh cầm canh luc n_y sẽ giảm xuống! 25%!

thuonghcm
26-09-2006, 17:56
Tôi làm như sau:

type mang=aray[1..1000]of integer;
var a:mang;k,n:byte;

procedure them(var a:mang;var n:byte;x:integer);
var i:byte;
for i:=1 to n do
if a[i]=x then exit;
inc(n);a[n]:=x;
end;

Begin
n:=10;k:=0;
for i:=1 to n do begin
readln(x);them(a,k,x);
end;
for i:=1 to k do
write(a[i]:6);
end.