Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
Ở đây ta nhận thấy phép cộng, có tính chất giao hoán, Nên ta sẽ sắp xếp mảng theo thứ tự tăng dần, sẽ ko làm thay đổi giá trị.
Mình sử dụng thuật toán 2 con trỏ.
1 con ở đầu mảng (i), 1 con ở cuối mảng (j).
Nhận thấy giá trị bé nhất của giá trị tuyệt đối là 0. Nên ta sẽ lấy số 0 làm mốc so sánh.
+ Nếu arr[i] + arr[j] == 0, thì dừng lại (vì là nhỏ nhất rồi, có xét thêm cũng vậy).
+ Nếu arr[i] + arr[j] > 0 thì giảm j 1 đơn vị (--j).
+ Nếu arr[i] + arr[j] < 0 thì tăng i 1 đơn vị (++i).
#include <bits/stdc++.h>
using namespace std;
int n, *arr = new int[1000005], res = INT_MAX;
int main() {
cin >> n;
for (int i =0; i < n; ++i) {
cin >> arr[i];
}
sort(arr, arr+n);
int i =0, j = n-1;
while(i < j) {
int kq =arr[i] + arr[j];
if(kq == 0) {
res = 0;
break;
} else if(kq > 0) {
res = min(res, abs(kq));
--j;
} else {
++i;
res = min(res, abs(kq));
}
}
cout << res;
return 0;
}
Hãy giúp mọi người biết câu trả lời này thế nào?
Sự kiện