Thử thách

Liên hệ QC
Chia 3 dư 2 mà thêm 1 đĩa thì đĩa cuối chỉ có 2 quả, không thỏa điều kiện. Hai quả dư đó phần thưởng cho người chia đó anh :D :D
Anh nhầm rồi. 2*c-q là số quả của mỗi loại sau bước 1. Vì thế Chia 3 dư 2 có nghĩa là sau bước 1 thì bên quít có 3*n + 2 quả và bên cam cũng có 3*n + 2 quả. Tức 3n quít và 3n cam sẽ cho 2n đĩa. Còn lại 2 quít và 2 cam chứ không phải chỉ 2 quít hoặc 2 cam. Mà 2 quít và 2 cam sẽ cho 1 đĩa (1 quít + 2 cam hoặc 1 cam + 2 quít)
----------
Nếu q = 101, c = 56 thì có trườg hợp chia 3 dư 2.
Bước 1: có q-c = 45 đĩa. Còn dư quít = cam = 2*c-q = 112-101 = 11 = 3*3 + 2, tức chia 3 dư 2.

Mỗi bên còn 11 thì trong bước 2 ta có 9 cam + 9 quít cho 6 đia. Còn lại 2 cam và 2 quít cho 1 đĩa (1 quít + 2 cam dư 1 quít, hoặc 2 quít + 1 cam dư 1 cam)
 
Lần chỉnh sửa cuối:
Đúng là tôi nhầm. Tôi nhân 2 trước rồi mới chia 3, sau đó làm tròn xuống.
Nếu là code trong hàm của anh sẽ là:

so_dia = (q - c) + ((2 * c - q) * 2) \ 3

Của anh:

so_dia = (q - c) + ((2 * c - q) \ 3) * 2
If (2 * c - q) Mod 3 = 2 Then so_dia = so_dia + 1
 
Lần chỉnh sửa cuối:
1636862344333.png
Từ
1636862294571.png
suy ra là trên mỗi đĩa phải có cả 2 loại quả. 3 quả cam làm sao xếp được một đĩa vậy?
...
1636862525257.png
Điều kiện là ít nhất một nọ hai kia nha bạn già. Nếu 3 cam được, thì 3 quit cũng được, vậy thì số đĩa = (P + Q)/3 (làm tròn), phân bước làm gì cho mệt

Bạn mô tả từng đĩa của 7 đĩa đó xem có thỏa điều kiện hai này 1 kia không nào?
...

Bởi vậy tôi mói bảo là "gợi ý". Chứ nó thẳng thừng thì đã là chẳng cần gợi ý.
Đề bài đâu có bắt chỉ làm 1 lượt. Sau khi xếp đủ 6 đĩa, mối đĩa 2 quýt 1 cam xong thì tôi còn lại 3 cam. Tôi lấy lại một đĩa 2 quýt 1 cam thì tôi còn 5 đĩa, với 2 quýt 4 cam. Cuối cùng tôi có 5 đĩa 2 quýt 1 cam và 2 đĩa 1 quýt 2 cam.

Mà giải thích như vậy là tôi lộ luôn giải thuật của tôi rồi :p
 
Tôi lại thử với 13 và 8, Kết quả ra 6. Trong khi dùng công thức của tôi ra 7. Minh họa bằng 2 cột H và I
C2=LET(q,A1,c,A2,MIN(q-c,c)+IF((c*2-q)>0,ROUNDDOWN((c*2-q)*2/3,0),0))

View attachment 269156
Code bài 15 bị lỗi là do chưa xét tới trường hợp lần chia 1 bị dư.
Có lẽ trong trường hợp Q>C & Q<2C, lấy tổng chia 3 như bài 18 bác có nói là đúng, kết quả sẽ là phần nguyên của (Q+C)\3

---
Đã sửa lại bài 15
 
Thế với cái giải thuật lộ đó thì cách tính thế nào? Nhất là cái vụ sắp lên (đĩa) rồi rút ra bớt?
Với còm-piu-tơ thì Q và C đã có sẵn.
Lập vòng lặp, cứ bên nhiều hơn thì bốc hai và bên kia thì bốc 1.
Cuối cùng, ta còn lại 1 trong 3 trường hợp sau:
- cả hai bên quýt cam đều hết -> chẵn chòi, êm đẹp.
- cả hai bên quýt cam đều còn 1, hoặc bên còn 1 hoặc 2 và bên kia 0. Đây là trường hợp lẻ số, số dư nhỏ hơn 3. Cũng như con toán chia số nguyên, chả thể nào thêm đĩa nào nữa.
- một bên hết và bên kia còn >= 3. Đây là trường hợp có khả năng chia thêm.
Giả sử bên còn là Q:
Lập vòng lặp, lấy 3 từ Q và 1 đĩa từ số đĩa có 2C. Một lượt như vậy ta thêm được 1 đĩa (thêm 2 bớt 1, còn 1).
Vòng lặp chạy đến khi Q < 3 hoặc không còn số đĩa với 2C.

Cái cần để ý của bài giải này là có đến vài con số để xét liên tục: số cam, số quýt, số đĩa của mỗi loại.

Thực tế thì cái cần xé là cần xé, đâu có biết bao nhiêu quả? Ông chủ có thể biết lúc mua là bao nhiều, những chở trên ghe, lái ghe nó chôm mất một mớ thì sao?

Gải theo thực tế thì cứ liên tục lấy đại một bên 2 và bên kia 1, không cần biết bên nào nhiều hơn. Cuối cùng thì cũng ra cái số dư như kiểu trên.
 
Bởi vậy tôi mói bảo là "gợi ý". Chứ nó thẳng thừng thì đã là chẳng cần gợi ý.
Đề bài đâu có bắt chỉ làm 1 lượt. Sau khi xếp đủ 6 đĩa, mối đĩa 2 quýt 1 cam xong thì tôi còn lại 3 cam. Tôi lấy lại một đĩa 2 quýt 1 cam thì tôi còn 5 đĩa, với 2 quýt 4 cam. Cuối cùng tôi có 5 đĩa 2 quýt 1 cam và 2 đĩa 1 quýt 2 cam.

Mà giải thích như vậy là tôi lộ luôn giải thuật của tôi rồi :p
À, tôi tưởng bác định xếp 3 cam vào 1 đĩa. Còn xếp lại thì được 7 đĩa. Làm theo bài #3 hay hàm của tôi cũng cho 7 đĩa.
 
Giả sử ban đầu có c cam, q quýt, không mất tính tổng quát ta giả sử c<=q. Các quả được xếp vào x đĩa 1 cam 2 quýt và y đĩa 1 quýt 2 cam. Số cam xếp được là x+2y, số quýt y+2x nên x+2y<=c, y+2x<=q. Do đó x+y<=x+2y<=c và x+y<=(c+q)/3.
Trường hợp c<=(c+q)/ 3 tức là 2c<=q thì max(x+y)=c, đạt được khi x=c, y=0, lúc này x+2y=c, y+2x=2c<=q.
Trường hợp c>(c+q)/ 3 thì 2c-q>=1, đặt c+q=3n+d (0<=d<=2) thì ta chứng minh max(x+y)=n, chọn x=q-n-d, y=c-n thì x+2y=c, y+2x=q-d<=q. Ta chứng minh x, y>=0. Trường hợp c=q=1 thì max(x+y)=0, ta xét q>1. 3x=3q-3n-3d=3q-(q+c-d)-3d=2q-c-2d>=q-2d>1-4=-3 mà 3x chia hết cho 3 nên 3x>=0, x>=0. 3y=3c-3n=3c-(q+c-d)=2c-q+d>0.
Tổng kết lại ta được max (x+y) = min(c, q, int((c+q)/3)).
 
Thực tế thì cái cần xé là cần xé, đâu có biết bao nhiêu quả? Ông chủ có thể biết lúc mua là bao nhiều, những chở trên ghe, lái ghe nó chôm mất một mớ thì sao?
.............
Giải theo thực tế thì cứ liên tục lấy đại một bên 2 và bên kia 1, không cần biết bên nào nhiều hơn. Cuối cùng thì cũng ra cái số dư như kiểu trên.
Quay lại vấn đề thực tế thì cách chia bằng cách lấy đại để có số dư đẹp sẽ rơi vào trường hợp phải lâm vào cảnh "sắp lên rồi lại phải rút ra" khá nhiều. Ví dụ mỗi loại sàn sàn 100 (100 và 80, tính toán thì ra 60 đĩa theo lý thuyết),
- Lấy đại 2 quả trúng vào bên 100, 1 quả bên 80: được 50 lần, dư 30 bên ít. Thế là phải rút ra 10 lần từ 10 đĩa đã chia để làm lại thành 20 đĩa mới
- Lấy đại 2 quả trúng vào bên 80, 1 quả bên 100: được 40 lần, dư 60 bên nhiều. Thế là phải rút ra 20 lần để tạo 40 đĩa mới

Tôi đề xuất:
Do " lái ghe nó chôm mất một mớ" nên không biết số lượng mỗi cần xé. Dùng mắt ước lượng sự to nhỏ của quả, ước lượng ra 2 trường hợp:

TH 1: Hai loại có số lượng sem sem (cam thì đèo, quýt thì to)
- Luân phiên lấy 2 này 1 kia và 2 kia 1 này cho đến khi bằng mắt có cảm giác 1 bên còn nhiều hơn hẳn
- Lấy 2 bên nhiều và 1 bên ít (không luân phiên), cho đến khi bằng mắt có cảm giác 2 bên gần bằng nhau
- Quay lại "luân phiên" như bước 1, rồi lại dùng mắt ước lượng để tiếp bước 2
Mức 100 thì vài lần là có thể đếm bằng mắt và không cần phải "rút ra" làm gì

TH 2: Một bên nhiều hơn hẳn bên kia (cam to ra cam, quýt nhỏ ra nhỏ)
- Lấy 2 bên nhiều và 1 bên ít cho đến khi bằng mắt có cảm giá số lượng còn lại của hai bên gần bằng nhau (bên quýt vơi hơn do trái nhỏ). Nếu bên ít hết trước thì ngưng.
- Luân phiên lấy 2 này 1 kia và 2 kia 1 này cho đến khi bằng mắt có cảm giác 1 bên còn nhiều hơn hẳn
- Lại lấy 2 bên nhiều và 1 bên ít như bước 1 và sẵn sàng làm bước 2 1 lần nữa.
Khi có thể đếm bằng mắt là coi như xong, không cần "rút ra".
 
Lần chỉnh sửa cuối:
Function XepDia21(ByVal cam As Long, ByVal quyt As Long) As Variant
' ham xep cam quyt len dia. Dieu kien: moi dia 3 qua gom ca hai loai.
' ham tra ve mot mang hai phan tu, phan tu 1 la so dia 2 cam, phan tu hai la so dia 2 quyt
Dim dia2C As Long, dia2Q As Long, i As Long
' xep dia 2 cam truoc
Do While cam >= 2 And quyt >= 1
XepMotDia dia2C, cam, quyt
Loop
' tuy theo so du cua quyt, tra bot dia lai
Do While quyt >= 3 And dia2C > 0
dia2C = dia2C - 1
dia2Q = dia2Q + 2
quyt = quyt - 3
Loop
' truong hop con du 1 cam va 2 quyt
Do While quyt >= 2 And cam >= 1
XepMotDia dia2Q, quyt, cam
Loop
XepDia21 = Array(dia2C, dia2Q)
End Function

Sub XepMotDia(ByRef soDia As Long, ByRef lay2 As Long, ByRef lay1 As Long)
soDia = soDia + 1
lay2 = lay2 - 2
lay1 = lay1 - 1
End Sub

' HAM TEST !!!!!!!!

Function t(cam, quyt)
a = XepDia21(cam, quyt)
' dia 2 cam, dia 2 quyt, so du cam, so du quyt
t = a(0) & ", " & a(1) & ", " & (cam - 2 * a(0) - a(1)) & ", " & (quyt - 2 * a(1) - a(0))
End Function
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom