Hướng dẫn cho Khoảng cách lớn nhất
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Authors:
\(\color{red}{\text{Spoiler Alert}_{{}_{{}^{{}^{v2.0}}}}}\)
\(\color{red}{\text{Khuyến khích bạn đọc trước khi đọc phần lời giải xin hãy thử code ra thuật của mình dù nó có sai hay đúng}}\)
\(\color{red}{\text{Sau đó từ phần bài giải và thuật toán trước đó mà đối chiếu, rút nhận xét với thuật của mình và thu được bài học (không lãng phí thời gian đâu).}}\)
\(\color{orange}{\text{Hint 1 <Brute-force>}}\)
- Thử từng cặp \((A[i], A[j])\) và tìm giá trị lớn nhất
\(\color{orange}{\text{Hint 2 <Implementation>}}\)
- Nhận thấy các điểm chỉ nằm trên trục \(Ox\) và \(Oy\)
Khi ta chọn một điểm ở trục \(Ox\) hoặc \(Oy\), giá trị của nó sẽ lớn hơn khi mình di chuyển ngược hướng từ nó với điểm \(O\)
Ta cần tìm \(max\) nên ta sẽ tìm các giá trị ngoài cùng
Lúc này có các trường hợp:
2 điểm cùng trục \(Ox\)
2 điểm cùng trục \(Oy\)
1 điểm ở trục \(Ox\), 1 điểm ở trục \(Oy\)
\(\color{green}{\text{Preference AC Code }}\): Implementation
\(^{^{\color{purple}{\text{Complexity : }} O(n)\ \color{purple}{\text{time}}\ ||\ O(1)\ \color{purple}{\text{memory}}}}\)
```cpp
ll sq(int x) { return 1LL * x * x; }
double dis(int d0, int d1) {
return sqrt(sq(d0) + sq(d1));
}
int main()
{
int max_x = -INF, min_x = +INF;
int max_y = -INF, min_y = +INF;
for (int n = readInt(); n-->0; )
{
int x, y;
cin >> x >> y;
maximize(max_x, x); /// Tim vi tri truc x ngoai cung (+)
maximize(max_y, y); /// Tim vi tri truc y ngoai cung (+)
minimize(min_x, x); /// Tim vi tri truc x ngoai cung (-)
minimize(min_y, y); /// Tim vi tri truc y ngoai cung (-)
}
double res = 0;
maximize(res, double(max_x - min_x)); /// Cung truc Ox
maximize(res, double(max_y - min_y)); /// Cung truc Oy
maximize(res, dis(max(abs(max_x), abs(min_x)), max(abs(max_y), abs(min_y)))); /// Hai diem 2 truc khac nhau
cout << setprecision(6) << fixed << res;
return 0;
}```
Bình luận