trang chủ / bài tập / giftmove

Chia lại quà

Đề bài

Mô tả

n hộp quà và m loại quà, các loại được đánh số từ 1 đến m. Trong một hộp, tất cả các món quà phải có loại đôi một khác nhau, tức là mỗi hộp là một tập con của {1,2,,m}.

Số quà trong các hộp hiện đang chênh lệch nhau. Bạn được phép thực hiện các thao tác chuyển: mỗi thao tác lấy một món quà thuộc loại k từ hộp u và bỏ vào hộp v (uv). Tại thời điểm thực hiện thao tác, hộp u phải đang chứa loại k, và sau khi bỏ vào thì hộp v vẫn không được có hai món quà cùng loại.

Mục tiêu chính là làm cho hiệu giữa số quà của hộp nhiều nhất và hộp ít nhất là nhỏ nhất có thể. Trong tất cả các cách đạt được mục tiêu đó, hãy tìm cách dùng ít thao tác chuyển nhất.

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên nm là số hộp và số loại quà.
  • n dòng tiếp theo mô tả các hộp. Dòng thứ i bắt đầu bằng số nguyên si là số quà trong hộp i, tiếp theo là si số nguyên đôi một khác nhau trong đoạn [1,m] là các loại quà có trong hộp đó.

Dữ liệu ra

  • Dòng đầu in ra số nguyên k là số thao tác ít nhất.
  • k dòng tiếp theo, mỗi dòng ba số nguyên ui, vi, ki mô tả thao tác chuyển món quà loại ki từ hộp ui sang hộp vi. Các thao tác được in theo đúng thứ tự thực hiện.

Nếu có nhiều đáp án tối ưu, in ra một đáp án bất kỳ.

Ràng buộc

  • 1n,m100000
  • 0sim
  • Tổng s1+s2++sn500000

Ví dụ

Input Output Giải thích
3 5
5 1 2 3 4 5
2 1 2
2 3 4
2
1 2 3
1 3 1
Tổng cộng có 9 món quà chia cho 3 hộp, nên đích đến là mỗi hộp đúng 3 món và hiệu bằng 0. Hộp 1 thừa 2 món: chuyển loại 3 sang hộp 2 (hộp 2 chưa có loại 3) và loại 1 sang hộp 3. Kết quả các hộp là {2,4,5}, {1,2,3}, {3,4,1}.
3 7
6 3 5 1 7 6 4
1 1
3 1 2 6
2
1 2 3
1 2 4
Tổng cộng 10 món quà chia cho 3 hộp, nên hiệu nhỏ nhất là 1: một hộp có 4 món, hai hộp còn lại có 3 món. Chỉ hộp 1 dư, nó giữ lại 4 món và chuyển 2 món cho hộp 2. Không thể chuyển loại 1 sang hộp 2 vì hộp 2 đã có loại 1.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0