Đề thi học sinh giỏi tin khối 10

hinoga

Member
{Năm học: 2005-2006. Thời gian: 90 phút}
Cho n người lần lượt có số hiệu là 1,2,3,4,...,N. Theo thứ tự đó, họ đứng thành một còng tròn và quay mặt về phía tâm còng tròn. Như vậy, ngay bên tay trái của người có số hiệu N là người có số hiệu 1. Theo chiều kim đồng hồ thì người B đứng sau người A có nghĩa là B đứng bên tay trái của A. Họ chơi một trò chơi như sau: bắt đầu từ người có số hiệu 1 đếm từ 1 -> K theo chiều kim đồng hồ thì người thứ K bước ra khỏi vòng tròn. Người còn lại trên vòng tròn mà đứng ngay sau người thứ K đó lại đếm từ 1 cho đến K theo chiều kim đồng hồ và người thứ K tiếp theo lại tiếp tục bước ra khỏi vòng tròn... Quá trình chơi kết thúc khi trên vòng tròn chỉ còn lại một người.
Ví dụ với N=5, K=3 thì người cuối cùng còn lại trên vòng tròn là người có số hiệu 4 và các số hiệu của những người lần lượt bước ra khỏi vòng tròn là: 3,1,5,2.
Yêu cầu: Lập chương trình (cụ thể là bằng ngôn ngữ Pascal) nhận vào 2 số nguyên N, K (N, K<=10000) và tìm số hiệu của người cuối cùng còn lại trên vòng tròn trong trò chơi mô tả ở trên.
Yêu cầu cụ thể với dữ liệu vào ra như sau:
Đối với học sinh lớp 10 chuyên tin:
Dữ liệu vào cho trong file văn bản có tên là GAME.INP: Dòng đầu ghi giá trị của n. Dòng thứ hai ghi giá trị của k.
Dữ liệu ra ghi vào file văn bản có tên là GAME.OUT, chỉ gồm 1 dòng ghi số hiệu của người cuối cùng còn lại trên vòng tròn.
Đối với học sinh không ở lớp 10 chuyên tin: Số n và k nhập từ bàn phím. Số hiệu của người cuối cùng còn lại trên vòng tròn in lên màn hình.
 

hinoga

Member
XD không biết anh có nói đùa không. Bài này dùng mảng +1 số lệnh đơn giản là xong mà (đk <=10000) (có 1 thằng đc 10 đ? XD)
 

temp12

New Member
thế cơ à ,anh thấy đây là bài josephus (1 bài toán cổ) .Em nào vậy.Cái anh làm nè các em xem thử xem
function tinh(u:integer):integer; begin if (k mod u)=0 then tinh:=u else tinh:=k mod u; end; procedure dem; var i,j,next,k1,sl:longint; begin fillchar(a,sizeof(a),0); a[1]:=1; for i:=2 to n do begin j:=tinh(i); a:=(j+a[i-1]-1) mod (i-1); if a=0 then a:=i-1; if a>=j then inc(a); end; end;
 

hinoga

Member
em chả nhớ mình làm thế nào nữa (nhưng đúng :">). Trong bài đó dùng 1 biến d để cứ inc(d), inc(i) nếu d=k thì del(a) đi -> lúc chỉ còn 1 phần tử -> nếu k thay đổi chắc cũng làm được :">
 

temp12

New Member
Không hiểu anh có hiểu sai cách em ko nhưng nếu quả thật là em làm cách đó thì không <> cách "mọi" (tức là đếm rồi xóa) .Còn nếu K <> thì sẽ <> đấy (dĩ nhiên nếu làm cách mọi thì sẽ thấy chả <> j)
À mà anh đang học lớp 11 nhé ghi nhầm :D
 

Tra cứu điểm thi

Phần mềm mới

Quảng cáo

11223344550983550000
Top