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

Mua Quà

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: Mua Quà

Hướng tiếp cận

Vì chỉ có một phiếu giảm giá, ta thử dùng phiếu cho từng món quà một. Với mỗi lựa chọn món được giảm giá, ta tham lam mua thêm các món còn lại rẻ nhất trong ngân sách còn lại.

Nhận xét quan trọng

  1. Tổng chi phí một món là Pi+Si. Với món được giảm giá, chi phí là Pi/2+Si.
  2. Để tối đa số món mua được, sau khi dùng phiếu cho một món, ta nên mua các món còn lại theo thứ tự tổng chi phí tăng dần (tham lam).
  3. N1000, ta có thể thử dùng phiếu cho từng món và tính kết quả trong O(NlogN) mỗi lần.

Thuật toán

  1. Tính tổng chi phí ci=Pi+Si cho mỗi món.
  2. Sắp xếp các món theo ci tăng dần.
  3. Với mỗi món j từ 0 đến N1 (thử dùng phiếu cho món j):
    • Chi phí của món j khi dùng phiếu: Pj/2+Sj.
    • Duyệt các món theo thứ tự đã sắp xếp: bỏ qua món j, mua lần lượt từ rẻ đến đắt cho đến khi hết ngân sách.
    • Lưu số món mua được.
  4. Lấy kết quả tốt nhất trong tất cả các thử nghiệm.

Độ phức tạp

  • Thời gian: O(N2)
  • 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