Bedao Mini Contest 21 - Cắt dây

Xem dạng PDF

Gửi bài giải


Điểm: 0,15 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

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

Cho ~n~ sợi dây, sợi dây thứ ~i~ có độ dài ~A_i~ đơn vị độ dài. Giả sử có một sợi dây độ dài ~X~, nếu ta cắt một đoạn độ dài ~0 < t < X~ thì ta sẽ được hai sợi dây mới độ dài ~t~ và ~X - t~.

Được thực hiện ~k~ phép cắt dây, hãy tìm độ dài nhỏ nhất có thể của sợi dây dài nhất nhé.

Input

Dòng đầu chứa hai số nguyên dương ~n~ và ~k~ ~(1 \le n \le 2 \times 10^5, 0 \le k \le 10^9)~, thể hiện số lượng sợi dây và số lượng phép cắt thực hiện.

Dòng thứ hai chứa ~n~ số nguyên dương ~A_1, A_2, ..., A_n~ ~(1 \le A_i \le 10^9)~ - độ dài ban đầu của ~n~ sợi dây.

Output

Gọi ~S~ là độ dài nhỏ nhất của sợi dây dài nhất, có thể cắt được sau ~k~ phép cắt dây. In ra giá trị ~S~ làm tròn lên đến phần nguyên.

Scoring

Subtask Điểm Giới hạn
1 ~20~ ~k = 1~
2 ~30~ ~n, A_i \le 1000~
3 ~50~ Không có ràng buộc gì thêm

Sample Input 1

5 1
3 3 3 4 5

Sample Output 1

4

Sample Input 2

2 3
7 9

Sample Output 2

4

Notes

Trong test ví dụ thứ hai, ta có thể thực hiện lần lượt các phép cắt như sau:

  • Với sợi dây độ dài ~7~, ta có thể cắt ra thành hai sợi dây độ dài ~\frac{7}{2}~.

  • Với sợi dây độ dài ~9~, ta có thể cắt ra thành hai sợi dây độ dài ~3~ và ~6~.

  • Với sợi dây độ dài ~6~, ta có thể cắt ra thành hai sợi dây độ dài ~3~.

Vậy sợi dây có độ dài lớn nhất là ~\frac{7}{2}~, ta cần in ra giá trị làm tròn lên là ~4~. Ta có thể chứng minh đây là phương án tối ưu.


Bình luận

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



  • 0
    venota_2009  đã bình luận lúc 19, Tháng 4, 2024, 18:25

    ai gthich de bai voi a, nghe kho hieu qua


  • 5
    nogo007akapkn  đã bình luận lúc 3, Tháng 10, 2023, 8:19 sửa 15

    My solve:

    Sử dụng chặt nhị phân và tham lam.

    Chặt nhị phân kết quả, ban đầu gán l=1 r=1e9. Với mỗi lần chặt kết quả, chạy vòng for trong mảng và kiểm tra xem với độ dài nhỏ nhất của sợi dây dài nhất hiện tại = mid thì có thể được cắt ra trong k lần cắt dây không

    Số lần cắt để đạt được độ dài mid của sợi dây thứ i là A[i]/mid-1 với A[i] chia hết cho mid và A[i]/mid với A[i] không chia hết cho mid, ví dụ mid=3, A[2]=9, A[3]=10 thì cắt A[2] 2 lần để có 3 sợi dây độ dài 3 và cắt A[3] 3 lần để có 3 sợi dây độ dài 3 và 1 sợi dây độ dài 1. Cộng số lần cắt này vào 1 biến đếm

    Kiểm tra biến đếm, nếu thỏa mãn biến đếm số lần cắt <= k thì tiếp tục tìm kiếm kết quả trong khoảng l -> mid hay cập nhật co r về mid ngược lại thì tìm kiếm kết quả trong khoảng mid+1->r cho tới khi l=r thì lúc đó mid là kết quả cuối cùng của bài toán

    My code:https://ideone.com/0qVQQf