Theme editor

[Tin] Pascan và vấn đề thi HSG Tin học

  • Người khởi tạo Người khởi tạo thanhkhoeo
  • Ngày bắt đầu Ngày bắt đầu

thanhkhoeo

Hội Vật Lý Đào Duy Từ
Tham gia
9/7/09
Bài viết
1,374
Điểm tương tác
235
Điểm
0
Tuổi
33
Nơi ở
644 quang trung 2, đông vệ
Thread owner
thành rất muôn thi hsg tin học vì thế thành lập topic này

có vấn đề này thanh nghiz mãi khônbg ra


tìm kiếm nhị phân dẫy sô gồm n số (n rất lớn 100 chữ số):love:
 
Re: pascan vấn đề thi hgs tin học

thành rất muôn thi hsg tin học vì thế thành lập topic này

có vấn đề này thanh nghiz mãi khônbg ra


tìm kiếm nhị phân dẫy sô gồm n số (n rất lớn 100 chữ số):love:
Tìm kiếm cái gì thế Thành?
Cái này học ở học kì 1 rồi mà.:amitabha:
 
Re: pascan vấn đề thi hgs tin học

Thành ơi dãy nhị phân có phải là dãy số 00000001 đúng không?
Tớ không hiểu là đề bài của cậu là muốn tìm cái gì ?
:sparkling:
 
Thread owner
Re: pascan vấn đề thi hgs tin học

đúng là dãy nhị phân nhưng tớ hỏi thuật toán tìm kiếm nhị phân cơ

đề bài là

cho 1 dẫy số gôm n số cho trước và 1 số x viết thuật toán tìm kiếm nhị phân xem x có thuộc n hay không
 
Re: pascan vấn đề thi hgs tin học

Cây nhị phân tổng quát là một tập hợp hữu hạn các đỉnh được xác định đệ quy như sau:
- Một tập trống là một cây nhị phân.
- Giả sử T1 và T2 là hai cây nhị phân không cắt nhau và r là một đỉnh mới không thuộc T1, T2. Khi đó ta có thể thành lập một cây nhị phân mới T với gốc r có T1 là cây con bên trái, T2 là cây con bên phải của gốc.
Cây nhị phân có thể trống, mỗi đỉnh của nó luôn luôn có hai cây con là cây con bên trái và cây con bên phải. Mỗi đỉnh của cây nhị phân chỉ có nhiều nhất là hai đỉnh con: một đỉnh con bên trái (đó là gốc của cây con trái) và một đỉnh con bên phải (đó là gốc của cây con phải).

Mã:
uses crt;
type nodePtr= ^node;
node= record
key: integer;
left,right: NodePtr
end;
var root,tk: nodePtr; x,chon,i,n: integer;
a: array[1..100] of integer; f: text;
procedure Chen(x: integer);
var p,q: nodePtr;
begin new(q); q^.key:=x; q^.left:=Nil; q^.right:=nil;
if root=NIL then root:=q else
begin p:=root;
while p<>NIL do
begin if x <>nil then p:=p^.left
else begin p^.left:=q; p:=nil end
end
else begin if x>p^.key then begin
if p^.right<>nil then p:=p^.right
else begin p^.right:= q; p:=nil end
end
else p:=nil;
end
end;
end;
end;
procedure TimKiem(x: integer; var p: nodePtr);
var found: boolean;
begin p:= root; found:= false;
while(p<>nil) and (not found) do
if p^.key=x then found:= true
else if x
end;
procedure InRong;
const max =50;
var truoc,cuoi,dem: integer; p,q: nodePtr;
h: array[1..max] of nodePtr;
begin h[1]:=root; truoc:=1; cuoi:=1; dem:=1;
while (dem>0) do
begin q:=h[truoc]; write(q^.key,’ : ‘); p:= q^.left;
if p<>nil then begin write(p^.key,’ – ‘); inc(cuoi);
h[cuoi]:=p; inc(dem);
end else write(‘NIL – ‘);
p:= q^.right;
if p<>nil then begin writeln(p^.key);
inc(cuoi); h[cuoi]:=P; inc(dem);
end else writeln(‘NIL’);
h[truoc]:=nil; inc(truoc); dec(dem);
end;
end;
procedure Xoa(var p: nodePtr);
var q,q1: nodePtr;
begin
if p^.right=NIL then begin q:=p; p:=p^.left end
else if p^.left=NIL then begin q:=p; p:=p^.right end
else begin q:= p^.left;
if q^.right=nil then begin p^.key:=q^.key;
p^.left:=q^.left
end
else begin
repeat q1:=q; q:=q^.right until q^.right=nil;
p^.key:=q^.key; q1^.right:= q^.left;
end
end;
dispose(q);
end;
procedure PreOrder(p: nodePtr);
begin if p<> nil then
begin writeln(p^.key); PreOrder(p^.left); PreOrder(p^.right) end;
end;
procedure InOrder(p: nodePtr);
begin if p<> nil then
begin InOrder(p^.left);writeln(p^.key); InOrder(p^.right) end;
end;
procedure PostOrder(p: nodePtr);
begin if p<> nil then
begin PostOrder(p^.left); PostOrder(p^.right); writeln(p^.key) end;
end;
begin root:=nil; clrscr;
repeat
writeln(’1.Chen 2.Xoa 3.TimKiem 4.InRong 5.PreOder ‘);
write(’6.InOrder 7.PostOrder 8.NhapTep 9.Exit. Chon:’);
readln(chon);
case chon of
1: begin write(‘Nhap khoa moi: ‘); readln(x); Chen(x);
end;
2: begin write(‘Nhap khoa can xoa: ‘); readln(x);
TimKiem(x,tk);
if tk<>nil then Xoa(tk)
else writeln(‘Khong tim thay gia tri khoa’);
end;
3: begin write(‘Nhap khoa can tim : ‘); readln(x);
TimKiem(x,tk);
if tk<>NIL then writeln(‘Da tim thay dinh co khoa : ‘,tk^.key)
else writeln(‘Khong tim thay dinh co khoa nay’);
end;
4: InRong;
5: begin writeln(‘Danh sach PreOrder: ‘); PreOrder(Root) end;
6: begin writeln(‘Danh sach InOrder: ‘); InOrder(Root) end;
7: begin writeln(‘Danh sach PostOrder: ‘); PostOrder(Root) end;
8: begin assign(f,’Cay.dat’); reset(f); readln(f,n);
for i:=1 to n do begin read(f,a[i]); Chen(a[i]) end;
close(f); write(‘Da nhap xong cay tu tep…’); readln;
end;
end
until chon=9;
end.


Giải thích: http://buithetam.wordpress.com/2009/11/20/cay-tim-kiem-nhi-phan/
 
Re: pascan vấn đề thi hgs tin học

À tớ hiểu rồi! có phải ví dụ như:
cho trước 1 dãy số từ 1 đến 100 chẳng hạn
Sau đó cho x
Và tìm xem giá trị của x có nằm trong dãy không à?
Hay quá nhỉ !
Tớ muốn nhờ xem có ai chương trình tính tổng hình vuông của các cạnh mà mỗi ô lại là một hình vuông!
Ví dụ như tình tổng hình vuông của bàn cờ vua hay bàn cờ vây chẳng hạn!
Hoặc tình tổng những ô vuông có giá trị lơn hơn rất nhiều như 1tỉ ô chẳng hạn!
Sau đó xem tổng của chúng là chẵn hay lẽ. Nếu là lẽ thì có phải là số nguyên tố hay không!
 
Re: pascan vấn đề thi hgs tin học

đúng là dãy nhị phân nhưng tớ hỏi thuật toán tìm kiếm nhị phân cơ

đề bài là

cho 1 dẫy số gôm n số cho trước và 1 số x viết thuật toán tìm kiếm nhị phân xem x có thuộc n hay không

Nếu là y/c này của chú thì không khó:

1.Sắp xếp dãy tăng dần , mục đích để chia dãy thành 2 nửa khoảng (khoảng giá trị bé và khoảng giá trị lớn)
2.Viết hàm đệ qui để xác định nửa khoảng mà số x thuộc vào.
3.Nếu x = giá trị biên của nửa khoảng mà ta đã chia -->dừng lại, kết luận x thuộc dãy, nếu không thì quay lại bước 2.

Pascal thì a ngu lắm, nên anh chỉ nói giải thuật được thôi. (Chú thông cảm vì anh là dân Chăn Nuôi Trồng Trọt)
 
Re: pascan vấn đề thi hgs tin học

Nếu là y/c này của chú thì không khó:

1.Sắp xếp dãy tăng dần , mục đích để chia dãy thành 2 nửa khoảng (khoảng giá trị bé và khoảng giá trị lớn)
2.Viết hàm đệ qui để xác định nửa khoảng mà số x thuộc vào.
3.Nếu x = giá trị biên của nửa khoảng mà ta đã chia -->dừng lại, kết luận x thuộc dãy, nếu không thì quay lại bước 2.

Pascal thì a ngu lắm, nên anh chỉ nói giải thuật được thôi. (Chú thông cảm vì anh là dân Chăn Nuôi Trồng Trọt)

anh ơi giúp em ở câu hỏi trên với! Em thấy anh có vẻ giỏi trò này ghê!:knife:
 
Thread owner
Re: pascan vấn đề thi hgs tin học

À tớ hiểu rồi! có phải ví dụ như:
cho trước 1 dãy số từ 1 đến 100 chẳng hạn
Sau đó cho x
Và tìm xem giá trị của x có nằm trong dãy không à?
Hay quá nhỉ !
Tớ muốn nhờ xem có ai chương trình tính tổng hình vuông của các cạnh mà mỗi ô lại là một hình vuông!
Ví dụ như tình tổng hình vuông của bàn cờ vua hay bàn cờ vây chẳng hạn!
Hoặc tình tổng những ô vuông có giá trị lơn hơn rất nhiều như 1tỉ ô chẳng hạn!
Sau đó xem tổng của chúng là chẵn hay lẽ. Nếu là lẽ thì có phải là số nguyên tố hay không!

không hiểu đề bài kậu ạk hiểu chết liền . cho đề sâu hơn đê toàn ơi
 
Thread owner
Re: pascan vấn đề thi hgs tin học

àk cứu em với pascal của em nó bị sao ấy em viết xong chương trình em bấm f9 thì báo ổn nhưng bấm ctrl+f9 để chạy file thì báo lỗi số 200. cách sử lí
 
Thread owner
Re: pascan vấn đề thi hgs tin học

Ai có những thuật toán hay thì cho mình xem vs nhé

Thuật toán đơn giản xử lý một tình huống trên bàn cờ !

Các trò chơi đối kháng giữa hai người chúng ta thường biết là những trò chơi như cờ tướng, cờ vua, cờ caro…đã được hình thành từ lâu. Và những người chơi luôn cố gắng tìm mọi cách để mình giành được phần thắng. Và bạn có biết rằng có thể đoán trước người thắng thua, hay hoà ? Điều này có nghĩa là nếu một trò chơi cho trước vị trí ban đầu thì kết quả tốt nhất mà người chơi đầu tiên đạt được đã được biết từ trước (giả thiết cả hai người chơi đều chơi tối ưu). Vấn đề là các trò chơi thường quá phức tạp nên không có một ai có thể đảm bảo rằng mọi nước đi của mình là tối ưu. Do vậy cho đến nay, chỉ một số lượng nhỏ bài toán đó đã được giải quyết.
Có thể hiểu đơn giản các bài toán dạng này như dạng đồ thị :
Cho đồ thị có hướng G=(V,E) (Đồ thị G có tập đỉnh V, tập cạnh là E). Với mỗi đỉnh

Một trò chơi hai người được định nghĩa là một đồ thị có hướng G = (V, E) trong đó mỗi trạng thái chơi tương ứng với một đỉnh của đồ thị, hàm E(v) là qui tẵc chơi tức là E(v) chứa các đỉnh hay trạng thái chơi mà từ v có thể đi đến. Hai người luân phiên nhau đi , ở thế chơi u người chơi chỉ có thể đi sao cho nước v nhận được thoả mãn . Trò chơi kết thúc khi đến lượt đấu mà không thể đi tiếp được nữa. (Thông thường thì người không thể đi tiếp là người thua cuộc).
Và cách xử lý những bài dạng này cũng trở nên đơn giản hơn. Chúng ta cùng xét một ví dụ cụ thể như sau:
Bài toán: Hai người luân phiên nhau điều khiển một con tốt theo một số con cho trước. Một người có thể di chuyển con tốt từ vị trí u đến v nếu có một đường nối trực tiếp có hướng từ u đến v. Trò chơi kết thúc không thể tiếp tục di chuyển. Người không thể tiếp tục đi là người thua cuộc. Hỏi nếu cho trước vị trí ban đầu và danh sách các đường nối hỏi người đi trước thắng hay người đi sau thắng hay cả hai hoà? Giả sử rằng hai người này rất thông minh các bước đi của họ là tối ưu (tức cả hai người không bao giờ đi các nước không có lợi cho mình).
Input:
- Dòng đầu ghi số N là số vị trí con tốt có thể đừng, và số M là số đường đi (có hướng) mà con tốt có thể đi (1≤ N ≤ 200, 1 ≤ M ≤ N*(N-1)).
- Dòng thứ hai ghi u là trạng thái bắt đầu.
- M dòng tiếp theo mỗi dòng ghi hai số u, v mô tả một đường đi từ u đến v.
Output:
- Ghi một số duy nhất 1, 2, hoặc 0. 1 nghĩa là người 1 thắng, 2 là người hai thắng, 0 là hoà.
Nhận xét:
- Những vị trí không có đường ra thì chắc chắn sẽ thua.
- Những vị trí nào có một đường ra nối với vị trí chắc chắn thua thì chắc chắn thắng.
- Những vị trí nào tất đường ra nối với các vị trí chắc chắn thắng thì chắc chắn thua.
- Những vị trí nào mà trạng thái thắng thua không thể xác định thì là vị trí hoà.
- Bài toán có trạng thái hoà: VD: có các đường nối 1 → 2, 2 → 3, 3 → 1, 1 → 4, 4 → 5.Các vị trí 1,2,3 sẽ hòa, 5 thua, 4 thắng.
Thuật toán:
- Lúc đầu coi tất cả các vị trí v đều hoà gán giá trị đỉnh F[v] = 0. Tìm các vị trí không có đường ra thì gán lại F[v] = 2 (tức là nếu người chơi ở vị trí này sẽ thua).
- Khi thay trạng thái một vị trí từ hoà sang thắng hoặc thua thì kiểm tra các vị trí có đường đi đến nó: Những vị trí u nào có một đường ra nối với vị trí v chắc chắn thua (F[v] = 2) sẽ thì chắc chắn thắng (thay F = 1); Những vị trí u nào tất đường ra nối với các vị trí v (F[v] = 1) chắc chắn thắng thì chắc chắn thua (thay F = 2).
- Quá trình này ngừng khi không có sự chuyển trạng nào nữa.

Chương trình con mô tả thuật toán:
procedure gan_nhan (u: byte);
var td, v : byte;
begin
td := 0;
if t then td := 1 else // t là trạng thái người chơi ở vị trí chắc thắng
if (vị trí không có đường ra, hoặc chắc chắn thua) then td := 2;
F := td;
if td <> 0 then
for v := 1 to N do
if F[v] = 0 then
if C[v, u] then gan_nhan (td);
End;
procedure Main;
var u : Integer;
Begin
Fillchar (F, sizeof (F), 0);
for u := 1 to N do
if Khong_Co_Canh_Ra (u) then Gan_nhan(u);
end;
 
Re: pascan vấn đề thi hgs tin học

Cái này hình như trong sách nó có lời giải ở phần cuối mà ? c:big_smile:Néu dây tuột thì đó là cơ may đấy!c:big_smile:
scared%20of%20santa
 
Sửa lần cuối:
Thread owner
Re: pascan vấn đề thi hgs tin học

Bài 2: Hoán vị đầu tầu
Xét một cơ cấu đường tầu vào kho để sửu chữa, với đường vào và đường ra cùng đi vào kho (giống stack). Giả sử đường vào có 4 đầu tầu 1, 2, 3, 4. Gọi V, R là phép đưa đầu tầu vào, ra khỏi kho. Nếu ta thực hiện một dãy VVRVVRRR thì thứ tự các đầu tầu trên đường ra sẽ là 2, 4, 3, 1. Như vậy ta có thể coi như hoán vị 2, 4, 3, 1 được tạo ra từ dãy VVRVVRRR.
Lập chương trình cho n đầu tầu và hoán vị tương ứng với n, xác định dãy sinh ra hoán vị đó nếu có, nếu không thông báo không tồn tại.


làm hộ với
 
Re: pascan vấn đề thi hgs tin học

Muốn làm hộ lắm ! Nhưng hông hiểu đề ? c:big_smile:
scared%20of%20santa
scared%20of%20santa
scared%20of%20santa
 
Sửa lần cuối:
Re: pascan vấn đề thi hgs tin học

Bài 2: Hoán vị đầu tầu
Xét một cơ cấu đường tầu vào kho để sửu chữa, với đường vào và đường ra cùng đi vào kho (giống stack). Giả sử đường vào có 4 đầu tầu 1, 2, 3, 4. Gọi V, R là phép đưa đầu tầu vào, ra khỏi kho. Nếu ta thực hiện một dãy VVRVVRRR thì thứ tự các đầu tầu trên đường ra sẽ là 2, 4, 3, 1. Như vậy ta có thể coi như hoán vị 2, 4, 3, 1 được tạo ra từ dãy VVRVVRRR.
Lập chương trình cho n đầu tầu và hoán vị tương ứng với n, xác định dãy sinh ra hoán vị đó nếu có, nếu không thông báo không tồn tại.
cái này trả bik nhưng nếu muốn làm thì lên hẳn cái web về IT + lập trình nhờ làm hộ nhiều thằng rảnh lắm.....
 
Thread owner
Re: pascan vấn đề thi hgs tin học

bài này dễ hơn mọi người làm thử xem sao nhé

Có n loại đồng xu, mỗi đồng có giá trị tương ứng là d1, d2, …dn. Muốn đổi một lượng tiền tương đương có giá trị là N xu ra tiền xu sao cho số đồng xu là ít nhất. Với giả thiết rằng, số đồng xu nhiều tuỳ ý.
 
Sửa lần cuối:
Re: pascan vấn đề thi hgs tin học

bài này dễ hơn mọi người làm thử xem sao nhé

Có n loại đồng xu, mỗi đồng có giá trị tương ứng là d1, d2, …dn. Muốn đổi một lượng tiền tương đương có giá trị là N xu ra tiền xu sao cho số đồng xu là ít nhất. Với giả thiết rằng, số đồng xu nhiều tuỳ ý.
scared%20of%20santa
scared%20of%20santa


Bài này ta chỉ cần dùng lệnh DIV và MOD là đổi được hết ! c:big_smile:
 
Sửa lần cuối:
Back
Top