Giúp đưa ý tưởng về bài tập

Cho dãy A gồm n số nguyên dương a1, a2, …, an. Hãy đếm số tam giác cân và số tam giác đều khác nhau được tạo thành bởi 3 đoạn thẳng có độ dài là 3 giá trị phẩn tử nào đó ở trong dãy số đã cho (Hai tam giác được gọi là giống nhau nếu chúng có 3 cặp cạnh tương ứng có độ dài bằng nhau, nếu không chúng được gọi là khác nhau)
Input
Dòng thứ nhất chứa số nguyên dương n <= 10^5
Dòng thứ 2 ghi n số nguyên dương a1, a2, …, an (a[i] <= 10^9, 1 <= i <= n)
Output
Ghi là 1 số nguyên là số lượng tam giác tìm được thỏa mãn đề bài

Ví dụ
Test 1

Input
6
1 2 2 2 4 5
Output
2
Giải thích
Có 1 tam giác cân: (1, 2, 2)
Có 1 tam giác đều: (2, 2, 2)

Test 2

Input
8
1 1 1 2 2 2 2 3
Output
4
Giải thích
Có 2 tam giác cân: (1, 2, 2); (3, 2, 2)
Có 2 tam giác đều: (2, 2, 2); (1, 1, 1)

Nhờ mọi người giúp, em vẫn chưa biết phải làm như nào.
Cảm ơn mọi người nhiều

Bạn có biết cách kiểm tra 3 con số có thể tạo thành 1 tam giác hay không?

Trước hết, bạn có thể xài 3 vòng for không? Nếu rút xuống 2 vòng for thì sao?

1 Like

Bạn nên làm câu tam giác đều trước. Tìm bộ 3 số giống nhau sẽ dễ hơn khi 3 số luôn liền kề nhau (lưu ý rằng đề không cho trước dãy không giảm)

1 Like

Cái đó mình biết rồi bạn, vấn đề là làm sao để có thuật toán chạy hết được cả n <= 10^5 thôi bạn

Này mình làm được rồi bạn, khó cái làm sao xử lý được tam giác cân thôi.

Giả sử bạn có 2 cạnh x bằng nhau của 1 tam giác cân. Vậy độ dài cạnh còn lại sẽ nằm trong khoảng nào?

Gọi cạnh còn lại là y thì ta có 2*x phải luôn lớn hơn y

Vậy là bài toán đưa về dạng

for (x...) {
    // đếm số lượng y thoả mãn 0 < y < 2*x
}

Bạn cố gắng đếm số lượng trong O(log n) là đẹp.

2 Likes

Bài này cần cả giá trị và tần suất của giá trị, nên sắp xếp xong chuyển thành mảng tần suất là OK.

3 Likes

Ok cảm ơn bạn, để mình nghiên cứu, còn không được thì mình cầu cứu bạn tiếp :>

OK cảm ơn ý tưởng bạn

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?