Bai toan den nhap nhay

5 81 0
Bai toan den nhap nhay

Đang tải... (xem toàn văn)

Thông tin tài liệu

Khi đó số lần k sẽ thay đổi trạng thái các bóng đèn có số hiệu i thuộc S[k], hay k là ước của i.. Do đó số lần thay đổi tạng thái của bóng đèn i bừng các ước số T(i) của i.[r]

(1)

Bài toán "đèn nhấp nháy" Ta bắt đầu tốn chương trình "Đường lên đỉnh olimpia"

Bài tốn Một dãy gồm 10 bóng đèn đánh số từ đến 10 trạng thái tắt Người ta thay đổi trạng thái bóng đèn thẻo qui tắc sau

Lần 1: thay đổi trạng thái tất bóng đèn Lần 2: thay đổi trạng thái đèn có số hiệu chia hết cho Lần 3: thay đổi trạng thái bóng đèn có số hiệu chia hết cho Cứ lần thứ 10 thay đổi trạng thái bóng đèn có số hiệu chia hết cho 10

Hỏi bóng đèn có số hiệu sáng?

Giải Khi thực việc thay đổi trạng thái, số bóng đèn tắt, số khác sáng Do dãy đèn cho trở thành dãy đèn nhấp nháy

Trước hết ta nhận xét rằng, sau 10 lần thay đổi trạng thái ra, bóng đèn có số lẻ lần thay đổi bóng đèn cịn sáng Ký hiệu S[k] tập hợp sối, 1<=i<=1, cho i bội k Khi số lần k thay đổi trạng thái bóng đèn có số hiệu i thuộc S[k], hay k ước i Do số lần thay đổi tạng thái bóng đèn i bừng ước số T(i) i Ta giải toán học sau Ta biết rằng, nếu:

+i=P1a1 pkak, p1, ,pk số nguyên tố khác nhau; T(i)=(a1+1) (ak+1) Do i số phương T(i) lẻ, trường hợp khác T(i) chẵn Suy bóng đèn có số hiệu 1, 4, cịn sáng Các bóng đèn khác bị tắt

+Ta có thuật toán sau -Với i, 1<= i<= 10 đặt T(i)=0

-Xét tất k, 1<= k<= i, k ước i T(i)=T(i)+1 -Nếu T(i) lẻ đèn T(i) sáng, T(i) chẵn đèn T(i) tắt

1.Rõ ràng với số lượng bóng đèn n lớn 10 nhiều giải tốn học khơng thể xác định số hiệu bóng đèn cịn sáng Khi nhờ cách giải trực tiếp máy tính ta nhanh chóng xác định số hiệu bóng đèn cịn sáng

Hơn nữa, số lần thay đổi trạng thái m cách giải thuận tiện Các bạn tự lập chương trình giải tốn với n,m trạng thái ban đầu dãy bóng đèn tuỳ ý Bạn tham khoả thêm thuật giải toán

Ta chuyển sang giải toán " đèn nhấp nháy" toán kì thi Tion học quốc tế lần thứ 10 (năm 1998 Bồ Đào Nha)

Bài toán Đèn cho ngày hội (PARTY)

(2)

Có máy đếm C để đếm tổng số lần ấn nút Ban đầu, tất ác đèn sáng C

Yêu cầu: Cho giá trị C trạng thái cuối số đèn Hãy lập chương trình xác định tất trạng thái ( có) cuối N đèn tương ứng với thông tin cho Dữ liệu vào: Tệp PARTY.IN chứa dòng Dong cho số N Dòng cho giá trị C Dòng cho danh sách đèn có trạng thái cuối tương ứng lad sáng hay tắt Số hiệu đèn danh sách cách dấu cách kết thúc số -1 Ví dụ tệp PARTY.IN có dạng

10 -1 -1

ở số đèn 10, ấn nút trạng thái cuối đèn tắt

Dữ liệu ra: Tệp PARTY.OUT chứa tất trạngk thái cuối có (khác nhau) đèn Mỗi trạng thái ghi dòng gồm N kí tự 1, ứng với đèn tắt, đèn sáng Thứ tự dòng tuỳ ý

Với liệu vào tệp PARTY.Out có dạng 0000000000

0110110110 0101010101

Hạn chế: 0<= N<= 100, 1<= C<= 10000 Số lượng đèn sáng đèn tắt trạng thái cuối <= Dữ liệu vào đảm bảo có trạng thái N đèn thoã mãn

Giải Ta chia N đèn thành nhóm khơng giao nhau: +Nhóm gồm đèn số hiệu lẻ khác dạng 3k+1 +Nhóm gồm đèn số hiệu chẵn khác dạng 3k+1 +Nhóm gồm đèn số hiệu lẻ có dạng 3k+1

+Nhóm gồm đèn có số hiệu chẵn có dạng 3k+1

(3)

+Khi ấn nút đèn thuộc nhóm thay đổi trạng thái

+Khi ấn nút đèn nhóm thay đổi trạng thái không Do đô ta cần xét đèn đại diện cho nhóm Hơn nữa, đèn không thay đổi trạng thái số lần thay đổi trạng thái chẵn Ngược lại, đèn thay đổi trạng thái Suy nút cần xét khả năng: số lần ấn nút chẵn kí hiệu số lần ấn nút lẻ kí hiệu Như vậy, ta càn xet 24 =16 khả xảy ra.

Ký hiệu ON tập đèn sáng OFF tập đèn tắt trạng thái cuối cho, s tập đèn sáng trạng thái cuối Khi trạng thái thừa nhận thoã mãn (ON<=S) (OFF<=[1 4]-S)

Ta có chương trình Pascal đầy đủ sau: Program Party;

Uses Crt;

Type t= Set Of 4

Var c,i1,i2,i3,i4,j,k,m,n:integer; On,off,s:T;

X:Array [ 50 ] Of Integer; Contr:Array [ 16 ] Of t; Flag:Boolean;

Inp,outp:Text;

Procedure ReadData; { thu tuc nhap du lieu }

Begin

Assign(inp,'a:pasparty.inp'); Reset(inp);

Readln(inp,a); Readln(inp,c); On:=[];Read(inp,j); While j<>-1 Do Begin

If j mod <>1 Then If od(j) Then On:=On+[1] Else

On:=On+[2] Else

If Od(j) Then On:=On+[3] Else On:=On+4; Read(inp,j); End;

If j=-1 Then Readln(inp); Off:=[];

readln(inp,j); While j<>-1 Do Begin

If j mod <>1 Then If od(j) Then off:=off+[1] Else

off:=off+[2] Else

If Od(j) Then off:=off+[3] Else

(4)

Read(inp,j); End;

Close(inp); End;

Procedure Solve {Thu tuc tim cac trang thai N den thoa man}

Begin

Asign(out,'a:pasparty.out');rewrite(out); For i4:=0 To Do

For i3:=0 to Do For i2:=0 To Do For i3:=0 To Do Begin

K:=i1+i2+i3+i4; If (c>=k) Then Begin

S:=[1 4];

For m:=1 To Do Case m Of

1:If Od(i1+i2) Then s:=s-[1]; 2:If od(i1+i3) Then S:=S-[2]; 3:If od(i1+i2+i4) Then S:=S-[3]; 4:If od(i1+i3+i4) Then s:=s-[4]; End;

If (on<=s) and(off<=[1 4]-s) Then Begin

For j:=1 To n Do If j mod 3<>1 Then If od(j) then If in s then write(out,1) Else

write(out,0) else

if in s then write(out,1) else

write(out,0) Else

if (od(j) then If In s Then write(out,1) Else

Write(out,0) Else

if in s then write(out,1) Else write(out,0; Writeln(out); End; End; End; Close(out); End; Begin ClrScr;

Writeln('Chuong trinh bat dau'); ReadData;

(5)

Writeln('Chuong trinh ket thuc'); Readln

Ngày đăng: 04/03/2021, 19:44

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan