Loading Now

arrangeBricks

Anh Lộc làm nghề phụ hồ cho một công ty xây dựng, Anh nhận thấy rằng mỗi loại gạch đều có độ cứng khác nhau.
Giả sử rằng viên gạch có độ cứng k chỉ có thể chịu được tối đa k viên gạch khác chồng lên nó, nếu nhiều hơn thì nó sẽ bị vỡ.

Cho mảng a gồm n viên gạch có độ cứng lần lượt là a0, a1, a2, ..., an.

Anh Lộc muốn lấy gạch và xếp chúng chồng lên nhau thành một chồng gạch cao nhất có thể mà không để vỡ viên gạch nào

Hãy tìm và in ra màn hình xem anh Lộc có thể xếp chồng gạch có độ cao lớn nhất là bao nhiêu.

Ví dụ: 

  • Với a = [1,1,2,1,1], thì kết quả sẽ arrangeBricks(a) = 3.
    Ta có
    • a[0] = 1 nghĩa là nó có thể chịu được 1 viên gạch xếp ở trên.
    • a[1] = 1 nghĩa là nó có thể chịu được 1 viên gạch xếp ở trên.
    • a[2] = 2 nghĩa là nó có thể chịu được 2 viên gạch xếp ở trên.
    • a[3] = 1 nghĩa là nó có thể chịu được 1 viên gạch xếp ở trên.
    • a[4] = 1 nghĩa là nó có thể chịu được 1 viên gạch xếp ở trên.

 Vậy nên ta có thể xếp được chồng cao nhất gạch gồm 3 viên gạch với thứ tự lần lượt sẽ là: a[2] -> a[1] -> a[1].
 Nghĩa là viên gạch có độ cứng 2 ở dưới cùng rồi đến 2 viên gạch có độ cứng 1 ở trên, chúng ta có thể tham khảo hình ví dụ ở bên dưới

 Như hình thì ta không xếp thêm viên gạch nào lên chồng gạch này nữa, nếu xếp thêm 1 viên nữa thì tùy viên gạch trên cùng có độ cứng 1 không bị vỡ nhưng những viên gạch phía dưới có độ cứng 12 sẽ bị vỡ.

Đầu vào/Đầu ra:

  • [Thời gian chạy] 0.5s với C++, 3s với Java và C#, 4s với Python, Go và JavaScript

  • [Đầu vào] Arrays.Integer a
    1≤ a.size ≤106.
    1 ≤ a[i] ≤ 109.

  • [Đầu ra] Integer
    Độ cao của chồng gạch cao nhất mà anh Lộc có thể xếp được.

Post Comment

Contact