

Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
Đây là câu trả lời đã được xác thực
Câu trả lời được xác thực chứa thông tin chính xác và đáng tin cậy, được xác nhận hoặc trả lời bởi các chuyên gia, giáo viên hàng đầu của chúng tôi.
`-` Ta có `(a_i + a_j) / 2 = k <=> a_i+a_j = 2k <=> a_j = 2k-a_i`.
`-` Với mỗi `a_i` đang xét, ta kiểm tra xem `a_j` (với `i != j`) có xuất hiện trong mảng hay không.
`***` Phương pháp cơ bản:
`-` Phương pháp cơ bản nhất để làm việc này là sử dụng 2 vòng lặp, vòng lặp `i` để xét từng giá trị và vòng lặp `j` để kiểm tra xem có tồn tại `a_j` (`i != j`) trong mảng hay không.
`-` Độ phức tạp về thời gian là O(n^2).
`***` Phương pháp tối ưu:
`-` Có khá nhiều cách để tối ưu, cách đơn giản nhất là sử dụng set để lưu lại những giá trị đã duyệt qua.
`-` Độ phức tạp về thời gian là O(nlogn).
$\\$
$\texttt{Code mẫu:}$
#include <iostream> //cin, cout
#include <set> //set
#define N 100005
using namespace std;
int main() {
int n, a[N], K; //Khai báo n, a, K
cin >> n; //Nhập số nguyên n
for (int i=1; i<=n; ++i) cin >> a[i]; //Nhập a
cin >> K; //Nhập K
set<int> s ; //Khai báo một set s
for (int i=1; i<=n; ++i) {
int aj = 2 * K - a[i]; //Tính toán aj
if (s.find(aj) != s.end()) { //Kiểm tra xem aj đã xuất hiện trong s chưa
cout << "YES"; //Nếu có, xuất YES
return 0; //và kết thúc chương trình
}
s.insert(a[i]); //Thêm ai vào s
}
cout << "NO"; //Không có cặp giá trị nào thỏa mãn
}
$\\$
$\color{#ffd710}{\texttt{\{}} \color{#8655d6}{\texttt{\{}}\ \ \color{#8cdcda}{\text{Daoanhviet96}}\ \ \color{#8655d6}{\texttt{\}}} \color{#ffd710}{\texttt{\}}}$
Hãy giúp mọi người biết câu trả lời này thế nào?

#include <iostream>
using namespace std;
int main() {
int n,k;
cin >> n >> k;
int a[n];
for (int i=0; i<n; i++) cin >> a[i];
for (int i=0; i<n-1; i++) {
for (int j=i+1; j<n; j++) if ((a[i]+a[j])/2==k) {
cout << "YES";
return 0;
}
}
cout << "NO";
return 0;
}
Hãy giúp mọi người biết câu trả lời này thế nào?

Bảng tin