Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
Em xin định hướng cách làm với c++
19:52 22-04-2023
537 lượt xem
5 bình luận
10:42 24-04-2023
Dùng một số thao tác để đổi chỗ các giá trị a[i] cạnh nhau để sắp xếp lại mảng gồm n phần tử sao cho những số cùng giá trị phải được đặt liên tiếp nhau.Tìm số thao tác ít nhất cần làm
vd 5 3 2 5 3 2 2
->3 thao tác (5 5 3 3 2 2 2)
(n<10^5,a[i]<=20)
Để sắp xếp lại mảng sao cho những số cùng giá trị phải được đặt liên tiếp nhau, ta có thể sử dụng thuật toán Counting Sort như sau:
Đếm số lần xuất hiện của từng phần tử trong mảng.
Dựa vào số lần xuất hiện, xác định vị trí đầu tiên của từng phần tử trong mảng đã sắp xếp.
Sắp xếp lại mảng bằng cách chuyển từng phần tử đến vị trí tương ứng trong mảng đã sắp xếp.
Đếm số lần cần phải chuyển để sắp xếp mảng.
Dưới đây là mã giả của thuật toán:
Độ phức tạp của thuật toán là O(n), với n là số lượng phần tử trong mảng.
Thông thường khi gặp một bài toán về số thao tác ít nhất nếu n nhỏ thì theo mình có thể sử dụng BFS để giải quyết, ở đây đề yêu cầu là n < 10^5 nên khả năng ta phải lập một công thức để đánh giá độ hoàn thiện của mảng và dùng A* giải quyết.
Tuy nhiên cũng có thể có một quy luật đơn giản nào đó sẽ khiến bài toán trở nên dễ dàng hơn, mình không giỏi tìm cái quy luật này lắm nên bạn tự suy nghĩ thử xem (không chắc là có nha). Sau thì mình đánh giá bài này là khó nên nếu ai đó ra đề thì chắc sẽ có bài giải thôi.