trang chủ / bài tập / baleshare / lời giải

Chia Ba Phần

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Lời giải: Chia Kiện Rơm

Hướng tiếp cận

Dùng quy hoạch động (DP) để duyệt tất cả cách chia N vật vào 3 nhóm. Trạng thái DP theo dõi tổng của nhóm 2 và nhóm 3; tổng nhóm 1 suy ra từ tổng cả ba.

Nhận xét quan trọng

  1. Với N20Si100, tổng tối đa là 20×100=2000. Không gian trạng thái (b2,b3) chỉ là 2001×20014×106 — chấp nhận được.
  2. Không cần lưu b1b1=totalb2b3.
  3. Dùng hai mảng boolean luân phiên (rolling array) để tiết kiệm bộ nhớ: good[cur][b2][b3] = có thể đạt trạng thái (b2,b3) sau khi xử lý các vật đầu.

Thuật toán

  1. Tính total = S_1 + S_2 + ... + S_N.
  2. Khởi tạo good[0][0][0] = true.
  3. Với mỗi vật i (từ 0 đến N1): với mỗi trạng thái (b2, b3) hợp lệ hiện tại, lan chuyển sang:
    • Đặt vào nhóm 1: (b2, b3) giữ nguyên.
    • Đặt vào nhóm 2: (b2 + S_i, b3).
    • Đặt vào nhóm 3: (b2, b3 + S_i).
  4. Sau khi xử lý hết, duyệt tất cả trạng thái (b2, b3) hợp lệ, tính b1 = total - b2 - b3, cập nhật đáp án = min(max(b1,b2,b3)).

Độ phức tạp

  • Thời gian: O(N·total2) với total2000
  • Bộ nhớ: O(total2)

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