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

Lợi nhuận tối đa một giao dịch

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

Hướng tiếp cận

Ta cần tìm cặp chỉ số (i,j) với i≤j sao cho pj−pi lớn nhất. Cách "brute" duyệt mọi cặp tốn O(n2), không khả thi khi n tới 2·105 và tổng n tới 106.

Quan sát: khi ta cố định ngày bán j, lợi nhuận tối ưu sẽ đạt được khi pi là giá nhỏ nhất trong tiền tố p1,…,pj. Vì vậy chỉ cần duy trì giá nhỏ nhất tiền tố (pmin) là đủ.

Nhận xét quan trọng

  • Điều kiện i≤j là mấu chốt. Nếu bỏ qua điều kiện này, ta sẽ ra max(p)−min(p), có thể sai khi max xảy ra trước min.
  • Khi mọi lợi nhuận đều âm/không, đáp án là 0 (không giao dịch), không phải số âm.
  • Có thể chọn i=j cho lợi nhuận 0, nên đáp án luôn ≥0.

Thuật toán

Khởi tạo pmin=p1, ans=0. Duyệt j từ 2 đến n:

  1. Cập nhật ans=max(ans,pj−pmin).
  2. Cập nhật pmin=min(pmin,pj).

Lưu ý thứ tự: phải tính ans trước (dùng pmin của tiền tố [1,j−1]), rồi mới cập nhật pmin với pj (cho lần sau). Nếu cập nhật pmin trước thì cũng đúng vì pj−pj=0 không làm xấu kết quả, nhưng cách viết "tính trước, cập nhật sau" rõ ràng hơn.

In ra ans.

Độ phức tạp

  • Thời gian: O(n) cho mỗi test, tổng O(∑n) — tối đa 106 phép cộng/so sánh.
  • Bộ nhớ: O(n) để đọc dãy (hoặc O(1) nếu đọc và xử lý online).

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