DHBB 2026 - DX36 - 10 - Trò chơi của các con số
Xem dạng PDFTrong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài
Countdown là trò chơi truyền hình nổi tiếng của nước Anh từ những năm 1980. Trò chơi yêu cầu người chơi giải quyết các câu đố trước áp lực của đồng hồ đếm ngược (Countdown timer). Có hai loại câu đố thường xuất hiện trên chương trình, câu đố về chữ cái và câu đố về con số. Ở bài toán này ta tìm hiểu về loại câu đố về các con số. Trò chơi mô tả như sau:
Người chơi chọn ngẫu nhiên ~6~ thẻ, ghi trên mỗi thẻ là một con số. Có hai loại thẻ bài, loại thẻ bài số nhỏ ~1,2,\dots,10~, mỗi thẻ có thể xuất hiện với số lần tuỳ ý, và loại thẻ bài số lớn ~25,50,75,100~, mỗi thẻ chỉ xuất hiện tối đa một lần. Máy tính sau đó sẽ chọn ra ngẫu nhiên một con số gồm tối đa ba chữ số. Gọi số đó là ~T~ ~(1 \le T \le 999)~. Nhiệm vụ của người chơi là sử dụng các phép toán cơ bản (cộng, trừ, nhân, chia) để tạo ra được số ~X~, sử dụng mỗi thẻ được cho nhiều nhất một lần.
Mô tả cụ thể hơn, người chơi được cho trước một tập hợp ~A=\{a_1,a_2,\dots,a_6\}~ gồm các thẻ đã chọn và số ~X~. Tại mỗi thao tác:
Người chơi lựa chọn hai thẻ ~x,y \in A~ bất kỳ và lấy chúng ra khỏi tập hợp ~A~. Lưu ý ~x~ và ~y~ phải là hai thẻ khác nhau, mặc dù chúng có thể ghi cùng một giá trị.
Người chơi sử dụng một phép toán ~\circ \in \{+,-,\times,\div\}~ để tính ra số ~z=x \circ y~. Ghi trên giấy một dòng có dạng ~x \circ y=z~.
Nếu ~z=T~, hoàn thành phần chơi.
Nếu ~z \ne T~, thêm ~z~ vào ~A~ và quay trở lại bước đầu tiên. Lưu ý sau bước này, kích thước tập hợp ~A~ đã giảm đi ~1~ so với trước khi thực hiện bước đầu tiên.
Lặp lại cho đến khi nào dựng được số ~T~ hoặc ~|A|=1~.
Đối với các phép toán được thực hiện, lưu ý rằng kết quả của phép toán phải là số nguyên dương. Do đó các phép toán như ~3-7~ hoặc ~7/2~ hoặc ~7/0~ là không hợp lệ.
Đây là một trò chơi mẫu đã phát sóng trên truyền hình. Lời giải ghi trên bảng ở hình bên có thể được viết lại như sau:
~75-10=65~
~65 \times 25=1625~
~1625+1=1626~
~1626 \times 50=81300~
~81300/100=813~
Lời giải này gồm ~5~ dòng. Không lời giải nào có số dòng ít hơn lời giải trên.
Nhiệm vụ của bạn là lập trình thuật toán để giải quyết trò chơi trên: Cho ~6~ số ~a_1,a_2,\dots,a_6~, hãy tìm một dãy các phép tính theo luật như trên để dựng được một số ~T~ cho trước, sử dụng ít phép tính nhất có thể.
Để tăng độ khó cho bài toán, với cùng bộ số trên, bạn sẽ phải tìm cách dựng tối ưu nhất cho nhiều số mục tiêu ~t_1,t_2,\dots,t_m~.
Input
Dòng ~1~: Gồm ~6~ số nguyên dương ~a_1,a_2,a_3,a_4,a_5,a_6~, thỏa mãn ~a_1 \ge a_2 \ge a_3 \ge a_4 \ge a_5 \ge a_6~ và ~a_i \in \{1,2,3,4,5,6,7,8,9,10,25,50,75,100\}~. Các số ~25,50,75,100~ chỉ xuất hiện tối đa một lần.
Dòng ~2~: Gồm số nguyên dương ~m~.
Dòng ~3 \rightarrow m+2~: mỗi dòng chứa số nguyên dương ~t_j~ ~(1 \le t_j \le 999)~ mô tả con số mục tiêu thứ ~j~.
Output
Gồm ~m~ nhóm dòng, nhóm dòng thứ ~j~ in ra dãy phép tính để dựng số thứ ~j~ như sau:
Nếu không tồn tại dãy phép tính để dựng được số ~t_j~, in ra ~-1~.
Ngược lại:
In ra ~k~ là số phép tính trong dãy phép tính.
~k~ dòng tiếp theo, mỗi dòng mô tả một phép tính theo định dạng ~x \circ y=z~.
Giữa hai nhóm dòng cho hai truy vấn, in ra một dòng trắng.
Scoring
| Subtask | Điểm | Ràng buộc |
|---|---|---|
| 1 | ~20\%~ | ~m=9; a_1 \le 10~ |
| 2 | ~20\%~ | ~m=9; a_1>10 \ge a_2~ |
| 3 | ~20\%~ | ~m=9; a_2>10 \ge a_3~ |
| 4 | ~20\%~ | ~m=9~ |
| 5 | ~20\%~ | ~m=900~ |
Sample Input 1
100 75 50 25 10 1
4
813
814
815
816
Sample Output 1
5
75 - 10 = 65
65 * 25 = 1625
1625 + 1 = 1626
1626 * 50 = 81300
81300 / 100 = 813
5
100 / 25 = 4
75 + 1 = 76
76 * 10 = 760
760 + 50 = 810
4 + 810 = 814
4
25 + 50 = 75
75 - 1 = 74
74 * 10 = 740
740 + 75 = 815
-1
Sample Input 2
50 25 6 5 3 3
4
299
301
303
305
Sample Output 2
3
50 * 6 = 300
3 / 3 = 1
300 - 1 = 299
3
50 * 6 = 300
3 / 3 = 1
300 + 1 = 301
2
50 * 6 = 300
300 + 3 = 303
2
50 * 6 = 300
300 + 5 = 305
Bình luận