QOJ.ac

QOJ

總分: 100 僅輸出

#8664. 尺規作圖

统计

軟件工程系嘅小 W 而家喺工程製圖嘅試場入面,但佢只係帶咗一把畀歲月磨甩晒刻度嘅直尺同一副圓規。佢冇晒辦法,唯有向幾何作圖能力驚人嘅你求助。請你用冇刻度嘅直尺同圓規,幫小 W 又快又準確噉完成製圖。

我哋將問題簡化一下。假設小 W 已經有座標系同單位長度,佢要你用尺規作出長度 $L_0$,即係得到點 $(L_0,0)$。

你可以用以下三種操作:

  1. $line(A,B)$:作一條經過點 $A$ 同點 $B$ 嘅直線。
  2. $circle(O,A,B)$:以 $AB$ 之間嘅距離做半徑,以點 $O$ 做圓心畫圓。
  3. $intersect(i,j)$:標記第 $i$ 個圖形同第 $j$ 個圖形嘅所有交點,有幾多個就標記幾多個。

一開始,小 W 會提供原點 $O(0,0)$,佢係 $0$ 號點。單位長度由 $1$ 號點 $(1,0)$ 提供。另外亦會提供 $x$ 軸($0$ 號圖形)同 $y$ 軸($1$ 號圖形)。

操作得到嘅所有新點同新圖形,都會接住編號。

假設而家嘅編號係 $n$,咁 $intersect$ 操作產生嘅點就會標記為 $n+1$。

如果兩個圖形冇交點,就唔會產生新點。

如果有兩個交點,$x$ 值較細($x$ 值相同時就揀 $y$ 較細)嗰個會標記為 $n+1$,另一個就係 $n+2$。

請你得到點 $(L_0,0)$,並指出佢嘅編號。你唔需要得到精確值,但你同精確值嘅差距,以及你用咗幾多次操作,都會影響你嘅得分。

輸入格式

呢題係提交答案題,所有輸入數據 draw1.in~draw10.in 已經放喺試題目錄入面。

每份輸入數據 $x_0$ 係一條 python 計算表達式。當中 ** 代表乘方運算,例如 3 ** 2 代表 $3^2$,2 ** 0.5 代表 $\sqrt2$。

為咗提供較高精度,表達式入面嘅數會轉成 decimal 類型,即係高精度小數。當中 Decimal(2) 就代表 $2$。

輸入保證數同符號之間、符號同符號之間,都會用一個空格分隔。

python 程式碼嘅輸出,就係要構造嘅數。

請留意,直接用 python 計出嚟嘅結果係近似值,但實際要求嘅係精確值,即係用嚟同你得到嘅結果比較嗰個值係精確值。

另外,我哋仲提供咗 draw.pdf,用方便閱讀嘅方式列出每組數據嘅表達式。

輸出格式

對於提供嘅 10 個輸入檔案 draw1.in~draw10.in,你需要分別提交輸出檔案 draw1.out~draw10.out。

輸出檔案第一行係一個整數 $n$,代表操作數。之後 $n$ 行,每行一個操作,三種操作對應嘅格式係:

line: L A B
circle: C O A B
intersect: I i j

參數嘅意思同題目描述一樣。

輸出檔案最後一行有一個整數,代表最後得到嗰個點嘅編號。

樣例

輸入格式 1

Decimal( 2 ) ** ( Decimal( 1 ) / Decimal( 2 ) )

輸出格式 1

5
C 0 0 1
I 1 2
C 0 1 3
L 1 3
I 0 3
5

說明

樣例入面五個操作嘅意思如下:

  1. 以 $O$ 點做圓心、單位長度做半徑畫圓,呢個圓係 $2$ 號圖形。
  2. 取 $2$ 號圖形(圓)同 $y$ 軸嘅交點,交點編號係 $2(0,-1),3(0,1)$。
  3. 以 $O$ 點做圓心,以 $1$ 號點同 $3$ 號點之間嘅距離做半徑畫圓,呢個圓係 $3$ 號圖形。
  4. 連接點 $(1,0),(0,1)$,產生嘅直線係 $4$ 號圖形。
  5. 取 $3$ 號圖形(圓)同 $x$ 軸嘅交點,交點編號係 $4(-\sqrt2,0),5(\sqrt2,0)$。

所以 $5$ 號點就係最後要得到嘅點。

評分方式

對於提供嘅 10 個輸入檔案 draw1.in~draw10.in,我哋分別提供評分參數檔案 draw1.ans~draw10.ans。

評分參數檔案共有十行,每行兩個數 $c_i,x_i$,表示如果最後得到嘅點 $(x,0)$ 嘅橫座標 $x$ 同 $L_0$ 嘅絕對值之差唔超過 $10^{-x_i}$,而且用嘅操作數 $n\le c_i$,就可以得 $i$ 分。

評測會取所有符合條件嘅分數當中最高嗰個;如果冇任何條件符合,就得 0 分。

點樣測試你嘅輸出

我哋提供 checker 呢個工具,測試你嘅輸出檔案可唔可以接受。首先開啟終端,執行以下指令進入本題嘅資料夾:

cd draw

然後執行:

./checker <case_no>

當中 case_no 係測試數據嘅編號。例如:

./checker 3

就會測試 draw3.out 可唔可以接受。

你執行呢個程式之後,checker 會根據你提供嘅輸出檔案顯示測試結果,包括:

  1. 非法退出:未知錯誤。
  2. Invalid parameters for checker.:傳畀 checker 嘅參數唔合法。
  3. Input/Output file does not exist.:輸入/輸出檔案唔存在。
  4. Output invalid:輸出檔案有錯,呢個時候可能會附有具體錯誤訊息。
  5. Correct! Your answer is n. Your score is s.:輸出可以接受,用咗 $n$ 次操作,呢個測試點得 $s$ 分。

更多功能

checker 仲可以檢查任意輸入、輸出檔案嘅測試結果,方法係喺終端執行:

cd draw
./checker <input_file> <output_file> <ans_file>

當中 input_file、output_file 同 ans_file 分別係輸入、輸出同評分參考檔案嘅名稱。

例如:

./checker draw3.in draw3.out draw3.ans

就會測試 draw3.out 可唔可以接受。

用 -w 可以輸出產生嘅每一個點嘅座標。輸出每行嘅格式係:

id x y

分別代表點嘅編號、$x$ 座標同 $y$ 座標。具體用法係:

./checker -w <input_file> <output_file> <ans_file>

或者:

./checker -w <case_no>

例如:

./checker -w draw3.in draw3.out draw3.ans

用 -i 可以同時輸出參賽者嘅輸出,方便除錯。具體用法係:

./checker -i <input_file> <output_file> <ans_file>

或者:

./checker -i <case_no>

例如:

./checker -i draw3.in draw3.out draw3.ans

用 -e prec 可以指定 checker 計算時嘅精度(有效位數)。唔用呢個選項時,prec 預設係 200。具體用法係:

./checker -e <prec> <input_file> <output_file> <ans_file>

或者:

./checker -e <prec> <case_no>

例如:

./checker -e 50 draw3.in draw3.out draw3.ans

-e prec、-w 同 -i 選項可以同時加入,次序不限,例如:

./checker -w -i -e 50 draw3.in draw3.out draw3.ans

提示

我哋可以用 python 得到表達式嘅近似值。具體嚟講,喺終端執行 python 之後,輸入:

from math import *
from decimal import *
getcontext().prec = 100

然後將輸入檔案入面嘅表達式(python 程式碼)複製到終端視窗,再按 Enter,就可以得到表達式嘅近似值(上面程式碼入面嘅 100 可以換成你想要嘅精度)。

特別提示

如果你用自己產生嘅輸入檔案嚟除錯,有可能因為規模太大而令 checker 出錯。遇到呢種情況,請試下規模細啲嘅數據。

請妥善保存輸入檔案 draw*.in、你嘅輸出檔案 draw*.out 同評分參數檔案 draw*.ans,並及時備份,以免誤刪。


或者逐个上传:

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.