trang chủ / đề bài / tallbarn / lời giải

Xây chuồng cao tầng

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: Xây chuồng cao tầng

Hướng tiếp cận

Bài toán yêu cầu phân bổ K con bò vào N tầng (mỗi tầng ít nhất 1 bò) sao cho tổng ∑ai/ci nhỏ nhất. Đây là bài toán tối ưu phân bổ tài nguyên với hàm lợi ích giảm dần.

Nhận xét quan trọng

  1. Lợi ích biên giảm dần: Khi thêm bò thứ (c+1) vào tầng i, lợi ích (giảm thời gian) là ai/c−ai/(c+1)=ai/(c(c+1)). Giá trị này giảm dần khi c tăng.

  2. Tham lam thông thường quá chậm: Cách tham lam "luôn thêm bò vào tầng có lợi ích biên lớn nhất" đúng nhưng có độ phức tạp O(KlogN), quá chậm khi K lên đến 1012.

  3. Tìm kiếm nhị phân trên lợi ích biên: Thay vì thêm từng bò, ta tìm kiếm nhị phân trên giá trị x - lợi ích biên nhỏ nhất mà ta chấp nhận khi thêm bò. Với mỗi giá trị x, ta tính được số bò tối đa có thể phân bổ sao cho mọi bò đều có lợi ích biên ≥x.

Thuật toán

  1. Tìm kiếm nhị phân trên giá trị thực x (lợi ích biên ngưỡng):

    • Với mỗi tầng i, tìm số bò ci lớn nhất sao cho ai/(ci(ci+1))≥x, tức là lợi ích biên của bò thứ ci vẫn ≥x.
    • Giải bất phương trình: ci(ci+1)≤ai/x, suy ra ci=⌊(1+4ai/x−1)/2⌋.
    • Tổng ∑ci cho biết số bò cần dùng. Nếu ∑ci≥K thì tăng x, ngược lại giảm x.
  2. Xử lý sau tìm kiếm nhị phân:

    • Sau khi hội tụ, ta có ngưỡng x và phân bổ ban đầu ci cho mỗi tầng.
    • Nếu tổng ∑ci<K, ta có dư bò. Các bò dư được thêm vào các tầng có lợi ích biên đúng bằng x (tức ai/(ci(ci+1))=x).
    • Nếu tổng ∑ci>K, ta bớt bò ở các tầng có lợi ích biên bằng x.
  3. Tính kết quả: Tổng ∑ai/ci, làm tròn đến số nguyên gần nhất.

Độ phức tạp

  • Thời gian: O(NlogV) với V là khoảng tìm kiếm nhị phân (khoảng 200 vòng lặp cho số thực), tức O(200N)≈O(N).
  • Bộ nhớ: O(N)

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.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0