Cái inp 1 bạn tìm = tay xem đồng giả là cái nào đi.
Cái inp 1 bạn tìm = tay xem đồng giả là cái nào đi.
j hoặc k hoặc l nặng hơn
Sặc. Xuống nghĩa là cái bên phải nhẹ hơn.
(Đọc lại đề)
=> G hoặc I là giả.
Mà kể cả như thế thì làm sao xác định được 1 đồng giả.
Bài này không thể có chữ "HOẶC"
uhm , thanks Q , thôi ko cãi nữa , cả 2 đều hiểu đề rồi , có ý tưởng gì thì nói nhé ^^
[=========> Bổ sung bài viết <=========]
à mà xuống nghĩa là nặng hơn chứ !đọc lại đề đi Q
Được sửa bởi bld lúc 21:28 ngày 22-07-2009 Reason: Bổ sung bài viết
Mình nghĩ thế này:
Vẫn như cũ, nhưng input như bld vừa rồi là không thể tìm ra.
Nếu mà chỉ có 1 cái ko phải là bằng và ko loại ra được như test đầu thì nghĩa là ko tìm được.
P/S: Cãi gì đâu, tranh luận thôi. Tranh luận thế giúp hiểu rõ bản chất hơn chứ. Việc gì phải sợ. Sai đâu sửa đấy mà.
Đề này tàu lao quá, nhỡ test không theo thuật toán đúng, thì sao tìm ra đồng xu giả.
Mình tìm được demo của bài cân bi, cũng tương tự bài này, nhưng trực quan hơn. Mọi người xem thử nha.
Bài này mình lấy từ đâu quên mất tiêu ời, sr tác giảCode:Program bai5; Uses crt; Const st1=' nang hon.'; st2=' nhe hon.'; Var i, kq1: integer; kq2: string; ch: char; (* Thu tuc Kq *) Procedure kq(a: integer; b: string); Begin kq1:=a; kq2:=b; End; (* Thu tuc Can *) Procedure can(lan: integer; t1, t2, t3, t4, p1, p2, p3, p4: string); Begin Writeln('Lan can thu', lan, ' :'); Writeln; Writeln(' ', t1, ' ', t2, ' ', t3, ' ', t4, ' ', p1, ' ', p2, ' ', p3, ' ', p4); Writeln; Write(' Ben nao nang hon? Trai(t)/Phai(p)/ Hay can bang(c)'); Repeat ch:=readkey; ch:=upcase(ch); Until (ch in ['P', 'T', 'C']); Writeln(ch); Writeln(*==========================================*); End; (* Thu tuc Play *) Procedure play; Begin Writeln('Co 12 qua can: 1 2 3 4 5 6 7 8 9 10 11 12'); Writeln('Cho phep ban chon ra mot qua can nang hon hay nhe hon nhung qua khac.'); can(1, '1', '2', '3', '4', '5', '6', '7', '8'); If (ch='T') then {T} Begin can(2, '1', '2', '5', ' ', '3', '4', '6', ' '); If (ch='T') then {TT} Begin can(3, '1', '6', ' ', ' ', '7', '8', ' ', ' '); If ch='T' then kq(1, st1); {TTT} If ch='P' then kq(6, st2); {TTP} If ch='C' then kq(2, st1); {TTC} End Else If (ch='P') then {TP} Begin can(3, '3', '5', ' ', ' ', '7', '8', ' ', ' '); If ch='T' then kq(3, st1); {TPT} If ch='P' then kq(5, st2); {TPP} If ch='C' then kq(4, st1); {TPC} End Else If (ch='C') then {TC} Begin can(3, '7', ' ', ' ', ' ', ' ', '8', ' ', ' '); If ch='T' then kq(8, st2); {TCT} If ch='P' then kq(7, st2); {TCP} If ch='C' then Begin Writeln('Tra loi sai!'); kq2:=st2; End; End; End Else If (ch='P') then {P} Begin can(2, '5', '6', '1', ' ', '7', '8', '2', ' '); If (ch='T') then {PT} Begin can(3, '5', '2', ' ', ' ', '3', '4', ' ', ' '); If ch='T' then kq(5, st1); If ch='P' then kq(2, st2); If ch='C' then kq(6, st1); End Else If (ch='P') then {PP} Begin can(3, '7', '1', ' ', ' ', '3', '4', ' ', ' '); If ch='T' then kq(7, st1); If ch='P' then kq(1, st2); If ch='C' then kq(8, st1); End Else If (ch='C') then {PC} Begin can(3, '3', ' ', ' ', ' ', ' ', '4', ' ', ''); If ch='T' then kq(4, st2); If ch='P' then kq(3, st2); If ch='C' then Begin Writeln('Tra loi sai !'); kq2:=st2; End; End; End Else If (ch='C') then {C} Begin can(2, '9', '10', '11', ' ', '1', '2', '3', ' '); If (ch='T') then {CT} Begin can(3, '9', ' ', ' ', ' ', '10', ' ', ' ', ' '); If (ch='T') then kq(9, st1); If (ch='P') then kq(10, st1); If (ch='C') then kq(11, st1); End Else If (ch='P') then {CP} Begin can(3, '9', ' ', ' ', ' ', '10', ' ', ' ', ' '); If (ch='T') then kq(10, st2); If (ch='P') then kq(9, st2); If (ch='C') then kq(11, st2); End Else If (ch='C') then {CC} Begin can(3, '12', ' ', ' ', ' ', '1', ' ', ' ', ' '); If (ch='T') then kq(12, st1); If (ch='P') then kq(12, st2); If (ch='C') then Writeln('Tra loi sai!'); kq1:=12; End; End; End; (* Chuong trinh chinh*) Begin Clrscr; play; Writeln(' Qua thu', kq1, kq2); Writeln(' Nhan Enter ket thuc...'); Readln; End.
theo "thuật toán đúng" thì mỗi lần cân phải đúng 4 quả mỗi dĩa và cân theo đúng 1 trình tự duy nhất đã xác định ,(như code trên của a nhat_truong )
nhưng mà yêu cầu đề bài ở đây là khác với yêu cầu tìm ra quả cân khác biệt của code trên
với inp thế này vẫn tìm dc quả cân khác biệt
A B bang
B C bang
C D xuong
vậy là biết ngay ông D nặng hơn
dĩ nhiên inp đưa vào sẽ dc sắp xếp để luôn suy ra dc kq
bây giờ công việc của ta là tìm ra kq chứ ko phải tìm xem sẽ cân như thế nào , bi73 vì kq các lần cân đã có
input của bài không nói là 2 bên cân phải nhất thiết là 4đồng xu, và cách cân thì input đa cho sắn rồi, chúng ta chỉ cần dựa vào kq cân mà đưa ra kq đồng xu giả.
nói luôn: xảo thuật là các thủ thuật dùng trong khi code, để chương trình chạy nhanh hơn và tốt hơn. Nếu 2 người dùg cùng 1 tư tưởng thuật toán, thì người nhanh hơn sẽ là người có xảo thuật tốt hơn.
bài này vét cạn là đúg, nhưng làm sao để code ra đựoc kq?
uhm , vậy e nghĩ đúng rồi ^^, nhưng mà vét cạn là vét cạn chứ xảo thuật gì đâu ?(hay e chưa nghĩ ra)
thử từng đồng xu giả sử là giả , rồi nếu cân ra đúng kết quả như dự đoán thì in ra kq
[=========> Bổ sung bài viết <=========]
@ quang : hừ , sợ gì đâu , lần sau mình sẽ xem lại cách dùng từ "cãi" và "tranh luận"
Được sửa bởi bld lúc 09:19 ngày 23-07-2009 Reason: Bổ sung bài viết
các bạn test thử & cho ý kiến nha , mình sợ nó chỉ đúng trong 1 số trường hợp vì mình làm cách đơn giản àhCode:const fi='dongxu.inp'; fo='dongxu.out'; type bien=record s1,s2,gt:string; end; var f:text; s:string; a:array[1..3] of bien; dd:array['a'..'l'] of byte; i,j,k,l:integer; procedure danhdau(s:string); var i:integer; begin for i:=1 to length(s) do dd[s[i]]:=2; end; procedure inp; begin fillchar(dd,sizeof(dd),0); assign(f,fi); reset(f); for i:=1 to 3 do begin readln(f,s); j:=1; k:=4; while j<=length(s) do begin dec(k); while s[j]= ' ' do inc(j); l:=j+1; while s[l]<>' ' do inc(l); if k=3 then a[i].s1:=copy(s,j,l-j); if k=2 then a[i].s2:=copy(s,j,l-j); if k=1 then a[i].gt:=copy(s,j,l-j); j:=l+1; danhdau(a[i].s1);danhdau(a[i].s2) end; end; close(f); end; procedure sol; begin for i:=1 to 3 do if a[i].gt='bang' then for j:=1 to length(a[i].s1) do begin dd[a[i].s1[j]]:=1; dd[a[i].s2[j]]:=1; end; end; procedure pri; var x:char; begin assign(f,fo); rewrite(f); for x:='a' to 'l' do if dd[x]=2 then begin write(f,x); close(f); halt; end; for x:='a' to 'l'do if dd[x]=0 then write(f,x); close(f); end; begin inp; sol; pri; end.
ý tưởng : nếu 2 đĩa cân nào = nhau thì mình đánh dấu . Cuối cùng mình sẽ in ra phần tử chưa đc đánh dấu , đó chính là đồng xu giả .Do t/c bắc cầu , ta có thể dễ dàng cm đc điều trên nếu chỉ có duy nhất 1 đồng xu giả
[=========> Bổ sung bài viết <=========]
trong ct này , mình gặp 1 vấn đề .Các bạn cho ý kiến lun nhá
inp : abcd efgh bang
Mình mún sau lệnh readln(f,s1,s2,gt) thì cho kq s1= abcd ; s2= efgh ; s3= bang nhưng mình f7 lại thấy s1 = abcd efgh bang , s2=' ', gt=' '. Mình đành phải đọc chuỗi s ùi cắt ra . Có cách nào hay hơn k ?
[=========> Bổ sung bài viết <=========]
test này cho inp :
ABCD EFGH bang
ABCI EFJK len
ABIJ EFGH bang
Nhưng đề có quá nhiều lỗ hổng : ngay trên inp này thì đồng xu L k đc cân , vậy liệu có bik đc nó là giả hay thật ?
Mình cũng đã nghĩ tới trường hợp , nếu inp k có 'bang'
vd :
ABCD EFGH lên
AICD EFGJ lên
AI FJ lên
==> A là đồng xu giả ( theo test ) .Vậy còn n~ đồng còn lại k đc cân, ai bik nó giả hay thật ==> inp phải có 'bang'
[=========> Bổ sung bài viết <=========]
Nếu mún code chặt chẽ hơn thì khi đọc a[i].gt có thể kt .Nếu tất cả đều là 'bang' thì in ra "k có đồng xu giả" , code mình chưa kt nên file out sẽ rỗng
Được sửa bởi hang_vt lúc 19:22 ngày 23-07-2009 Reason: Bổ sung bài viết
Bookmarks