Gửi bài giải

Điểm: 0,01 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: WORK.INP
Output: WORK.OUT

Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Trong ~1~ dây chuyền làm việc của công ty có ~N~ công nhân làm ~N~ việc. Người ta đánh số cho công nhân từ ~1~ đến ~N~ theo thứ tự đứng trong dây chuyền. Thời gian hoàn thành ~1~ công việc của người thứ ~i~ là ~t_i~ phút. Mỗi người cần làm xong công việc của mình nhưng được quyền làm tối đa ~2~ việc. Vì thế họ có thể phối hợp với người đứng ngay trước mình cùng làm, nếu người thứ ~i~ và người thứ ~i+1~ phối hợp thì thời gian làm xong cho ~2~ người là ~p_i~. Tìm phương án sao cho ~N~ công việc đều hoàn thành với thời gian ít nhất.

Input

Vào từ file văn bản WORK.INP:

  • Dòng thứ nhất ghi số ~N~ (~1 \le N \le 10^6~)

  • Dòng thứ hai ghi thời gian làm xong việc của từng công nhân tương ứng trong dây truyền ~t_1, t_2, ..., t_N~ (~1 \le t_i \le 60~)

  • Dòng thứ ba ghi ~N-1~ số thời gian cùng làm tương ứng cho số cặp công nhân nếu phối hợp ~p_1, p_2, ..., p_{N-1}~ (~1 \le p_i \le 100~)

Output

Ghi ra file WORK.OUT là ~1~ số duy nhất ghi tổng thời gian hoàn thành công việc ít nhất của ~N~ công nhân.

Sample Input 1

5
2 5 7 8 4
3 9 10 10

Sample Output 1

17

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    quangthenpc  đã bình luận lúc 4, Tháng 4, 2025, 11:24 sửa 5

    Spoiler

    Tạo một mảng dp[i] là thời gian tối thiểu để hoàn thành công việc của i người (ở đây mình sẽ coi như người thứ i nhờ người thứ i-1 làm chung).

    Để tìm được dp[i] thì ta có 2 lựa chọn:

    • Tự làm: dp[i] = dp[i - 1] + t[i]
    • Làm chung với người i-1: dp[i] = dp[i - 2] + p[i] (vì người i-1 đã hoàn thành xong việc ở bước trước)

    Nói cách khác: dp[i] = min(dp[i - 1] + t[i], dp[i - 2] + p[i])

    Code: https://onlinegdb.com/cpRelvBB0

    Cài đặt bước đầu: dp[1] = t[1]