Định vị

Xem dạng PDF

Gửi bài giải

Điểm: 800 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Dạng bài
Ngôn ngữ cho phép
Ada, Assembly, Awk, Brain****, C, C#, C++, COBOL, D, Dart, F#, Forth, Fortran, Go, Groovy, Haskell, Intercal, Java, JS, Kotlin, Lisp, Lua, ObjC, OCaml, Pascal, Perl, PHP, Pike, Prolog, PyPy, Python, Racket, Ruby, Rust, Scala, Scheme, Scratch, Sed, Swift, TCL, Turing, VB, Zig

Trên biển có ba ngọn hải đăng không thẳng hàng. Ta coi mặt biển như một mặt phẳng toạ độ, ba ngọn hải đăng lần lượt nhận toạ độ ~\mathbf p_1 = (x_1,y_1)~, ~\mathbf p_2 = (x_2,y_2)~, ~\mathbf p_3 = (x_3,y_3)~. Trên mặt phẳng này tồn tại điểm duy nhất cách đều cả ba ngọn hải đăng (theo nghĩa Euclid), ta gọi điểm duy nhất đó là vị trí trung tâm.

Trên tay bạn là một radar, có nhiệm vụ trả về ngọn hải đăng gần nhất với một vị trí ~\mathbf p = (x,y)~ bất kỳ được chỉ định. Chỉ sử dụng chiếc radar đó, bạn hãy xác định vị trí trung tâm của ba ngọn hải đăng trên. Đáp án của bạn coi như hợp lệ nếu toạ độ mà bạn đưa ra đủ gần với toạ độ thực của vị trí trung tâm (mô tả chi tiết ở mục Cách tính điểm).

Tương tác

Đây là bài toán tương tác. Bạn sẽ không biết bất cứ thông tin gì ngoài giới hạn của các toạ độ.

Gửi truy vấn

Bạn sẽ gửi vào luồng xuất chuẩn stdout câu hỏi có dạng

@ x y

Trong đó, ~x~ là hoành độ, ~y~ là tung độ của điểm truy vấn ~(0 \le |x|, |y| \le 10^{20})~.

Lưu ý:

  • Sau mỗi truy vấn, cần flush stdout bằng câu lệnh cout << flush; hoặc các câu lệnh tương đương.
  • Thí sinh không được gửi quá ~10^6~ truy vấn.

Nhận kết quả truy vấn

Bạn sẽ đọc từ luồng nhập chuẩn stdin câu trả lời có dạng

r

Trong đó, ~r = 1, 2, 3~ là số hiệu của ngọn hải đăng gần điểm truy vấn nhất. Nếu có nhiều hơn một ngọn hải đăng có cùng khoảng cách ngắn nhất, ~r~ sẽ nhận ngẫu nhiên một trong các giá trị hợp lệ.

Gửi câu trả lời

Bạn sẽ gửi vào luồng xuất chuẩn stdout câu trả lời có dạng

! x y

Trong đó, ~x~ là hoành độ, ~y~ là tung độ của điểm truy vấn ~(0 \le |x|, |y| \le 10^{20})~.

Lưu ý:

  • Sau lệnh trả lời, cần flush stdout bằng câu lệnh cout << flush; hoặc các câu lệnh tương đương.

Cách tính điểm

Kỳ thực, tác giả cũng không biết vị trí trung tâm ấy nằm ở đâu, do đó cách tính điểm của bài này sẽ dựa trên tiêu chí “cách đều” của toạ độ đáp án so với toạ độ của ba ngọn hải đăng. Cụ thể, gọi

$$ \delta_1 = \| \mathbf p_1 - \mathbf p \| = \sqrt{(x_1-x)^2 + (y_1-y)^2} $$ $$ \delta_2 = \| \mathbf p_2 - \mathbf p \| = \sqrt{(x_2-x)^2 + (y_2-y)^2} $$ $$ \delta_3 = \| \mathbf p_3 - \mathbf p \| = \sqrt{(x_3-x)^2 + (y_3-y)^2} $$

Khi đó, chỉ số “cách đều” được tính bằng công thức

$$ \boxed{\Delta = \max\{ \delta_1, \delta_2, \delta_3 \} - \min\{ \delta_1, \delta_2, \delta_3 \}} $$

Giả sử một test có giá trị ~T~ điểm, khi đó điểm số của thí sinh là ~\max\{0; 1 - \Delta\} \times T~, làm tròn đến hai chữ số thập phân gần nhất.

Ví dụ

~\Delta = 1.441 - 1.438 < 0.01~. Thí sinh được ~100\%~ số điểm.

Giới hạn

  • ~0 \le |x_1|,|y_1|,|x_3|,|y_3|,|x_3|,|y_3| \le 100~

Subtask

Gọi ~\alpha~ là góc lớn nhất trong tam giác tạo bởi ba ngọn hải đăng.

  • Subtask 1 (50%): ~\alpha = 90^\circ~
  • Subtask 2 (25%): ~60^\circ \le \alpha < 90^\circ~
  • Subtask 3 (25%): ~90^\circ < \alpha \le 135^\circ~

Lời giải ví dụ

#include <bits/stdc++.h>
using namespace std;

int ASK(long double x, long double y) {
    cout << "@ " << x << " " << y << endl << flush;
    int r; cin >> r;
    return r;
}

void ANSWER(long double x, long double y) {
    cout << "! " << x << " " << y << endl << flush;
    exit(0);
}

int main(void) {
    int nearest_to_centre = ASK(0, 0);
    ANSWER(0, 0);

    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.