Phân phối M phiếu giảm giá; mỗi phiếu thay giá hiện tại x của một món bằng ⌊x/2⌋, nhằm tối thiểu hóa tổng giá cuối cùng.
Input
Dòng đầu chứa N và M.
Dòng thứ hai chứa N giá ban đầu Ai.
Output
In tổng giá nhỏ nhất sau khi dùng đủ M phiếu.
Constraints
1≤N,M≤105.
1≤Ai≤109.
Mọi giá trị input là số nguyên.
Scoring
Subtask 1 (50% số điểm): N,M≤12.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
4 5
20 7 3 10
Output
13
Giải thích: Năm lần giảm lần lượt có thể biến đa tập giá thành 5,3,3,2; tổng nhỏ nhất khi đó là 13.
Lời giải tóm tắt
Phân tích: Phân phối M phiếu giảm giá; mỗi phiếu thay giá hiện tại x của một món bằng floor(x/2), nhằm tối thiểu hóa tổng giá cuối cùng. Cấu trúc dữ liệu chuẩn trong topic cho phép duy trì đúng thông tin cần thiết mà không phải duyệt lại toàn bộ trạng thái sau mỗi bước.
Thuật toán: Đưa các giá vào max-heap. Mỗi lần lấy giá lớn nhất, thay nó bằng một nửa lấy phần nguyên rồi đưa trở lại heap; cuối cùng cộng các phần tử.
Chứng minh tính đúng đắn: Mức giảm của một phiếu trên giá x là ceil(x/2), không giảm khi x tăng. Vì vậy tại mọi bước, chuyển phiếu đang dùng trên một giá nhỏ hơn sang giá lớn nhất không làm tổng cuối tăng. Lập luận trao đổi lặp lại cho mọi phiếu cho thấy chiến lược heap đạt tối ưu.
Độ phức tạp: Thời gian O((N+M) log N), bộ nhớ O(N).