trang chủ / bài tập / 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/cai/(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/x1)/2.
    • Tổng ci cho biết số bò cần dùng. Nếu ciK 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.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