30/09/2018, 23:13

Mọi người cho mình xin thuật toán của bài này..mình suy nghĩ nhưng ko biết làm thế nào

"Diện tích " của một chuỗi được mô tả như sau:
ví dụ: abbcdacb
a: 2 lần
b: 3 lần
c: 2 lần
d 1 lần
Diện tích là: 22+33+22+11=18

Cho một chuỗi s và một số k bất kì.Viết hàm loại bỏ k lần một kí tự từ chuỗi s sao cho diện tích của chuỗi s là min

Ví dụ trong chuỗi s ở trên nếu k =3 thì
Diện tích nhỏ nhất là: 11+11+22+11=7
(a mất 1 lần,b mất 2 lần)

Khánh Nguyễn viết 01:21 ngày 01/10/2018

Tìm số lần xuất hiện lớn nhất của một kí tự nào đó rồi trừ đi 1. Lặp lại k lần như vậy. Đây chỉ là ý tưởng ban đầu, bạn có thề suy nghĩ thêm để optimize nó.

Mai Hữu viết 01:29 ngày 01/10/2018

Trước tiên tìm toàn bộ số lần các kí tự trong dãy. xét xem cái nào lớn nhất. sau đó xét k và số lượng kí tự cao nhất.
Nếu k nhỏ hơn thì giảm kí tự đó đi k lần.
Nếu k lớn hơn thì giảm kí tự đó đi về còn 1 lần. và sau đó k sẽ còn là k- số lượng kí tự đó. rồi xét tiếp đến kí tự lớn thứ 2 rồi làm tương tự

Gió viết 01:26 ngày 01/10/2018

Lấy ví dụ dãy s=abbcdacb
Mảng đếm có dc T={a:2,b:3,c:2,d:1}
V là diện tích của chuỗi
Để Vmin thì mỗi lần xoá, ta xoá đi chữ số nào có nhiều nhất. bởi nếu a>b thì a*a-(a-1)*(a-1)>b*b-(b-1)*(b-1) là độ chênh lệch V(min) sau khi xoá. Như vậy bạn phải làm dc 2 việc:
-tìm max(mảng đếm), cập nhật lại giá trị đó
-cập nhật lại V

Bạn dùng priority_queue cho việc 1. Từ đó có thể cập nhật kết quả việc 2 dễ dàng

Bài liên quan
0